Sunday, July 12, 2015

თავი 7 (7,7 - 7,8)



7.7 try, except, და open - ის გამოყენება

გეუბნები არ შეხედო. ეს შენი ბოლო შანსია.

რა მოხდება მომხმარებელი თუ დაწერს რამე ისეთს, რაც ფაილის სახელი არაა?

python search6.py
Enter the file name: missing.txt
Traceback (most recent call last):
    File "search6.py", line 2, in <module>
       fhand = open(fname)
IOError: [Errno 2] No such file or directory: 'missing.txt'

python search6.py
Enter the file name: na na boo boo
Traceback (most recent call last):
    File "search6.py", line 2, in <module>
        fhand = open(fname)
IOError: [Errno 2] No such file or directory: 'na na boo boo'

არ გაგეცინოს. მომხმარებლები გააკეთებს ყველაფერს, რამაც შესაძლებელია შენი პროგრამა გააფუჭოს - გამიზნულად ან ბოროტი განზრახვით. ნებისმიერი პროგრამული უზრუნველყოფის გუნდისთვის მნიშვნელოვანია ხარისხის მაკონტროლებელი(Quality Assurance or QA) რომლის სამუშაოა პროგრამას გაუკეთოს ყველაზე გიჟური რამეები, რომ გატეხოს.
ხარისხის კონტროლის (ხ.კ.) გუნდი პასუხისმგებელია პროგრამაში დეფექტების პოვნაზე მანამ, სანამ პროგრამა მივა საბოლოო მომხმარებლამდე, რომელმაც შეიძლება იყიდოს ეს პროგრამა ან გადაგვიხადა, რომ ეს პროგრამა დაგვეწერა. ასე რომ ხ.კ. გუნდი  არის პროგრამისტის საუკეთესო მეგობარი.
ახლა, როცა ვნახეთ პროგრამის დეფექტი, უკვე შეგვიძლია  მოხდენილად გამოვასწოროთ try/except - ის დახმარებით: გვჭირდება დავუშვათ, რომ open შეიძლება ჩავარდეს და ამ შემთხვევისთვის ვამატებთ განახლების კოდს:

fname = raw_input('Enter the file name: ')
try:
            fhand = open(fname)
except:
            print 'File cannot be opened:', fname
            exit()

count = 0
for line in fhand:
            if line.startswith('Subject:') :
                        count = count + 1
print 'There were', count, 'subject lines in', fname

exit ფუნქცია პროგრამას გათიშავს. ესაა ფუნქცია, რომელიც არასდროს აბრუნებს( returns). ახლა, როცა ჩვენი ხ.კ. შეიყვანს რამე სისულელეს, გამოვიჭერთ და აღვადგენთ მოხდენილად:

python search7.py
Enter the file name: mbox.txt
There were 1797 subject lines in mbox.txt

python search7.py
Enter the file name: na na boo boo
File cannot be opened: na na boo boo


open - ის "დაცვა" კარგი მაგალითია try და except - ის სწორი გამოყენებისა პითონის პროგრამაში.  როცა რამეს ვაკეთებთ "პითონის გზით",  ვიყენებთ ტერმინ "პითონიკს". შეგვიძლია ვთქვათ, რომ ზემოთ მოყვანილი მაგალითი არის პითონიკური გზა ფაილის გასახსნელად.
როცა პითონში მეტ ცოდნას დააგროვებ, შეგეძლება პითონის პროგრამისტებთან იკამათო პრობლემის ორი თანასწორი გადაჭრიდან რომელია უფრო პითონიკური.  უფრო პითონიკურად ყოფნა აჩენს აზრს, რომ პროგრამირება არის ნაწილი ინჟინერიის და ნაწილი ხელოვნების. ყოველთვის არ ვართ დაინტერესებული, რომ გავაკეთოთ რაღაც, რაც მხოლოდ მუშაობს,  ასევე გვინდა, რომ პრობლემის ჩვენებური გადაჭრის გზა იყოს მოხდენილი და თანასწორებისგან დაფასებული, როგორც ელეგანტური.

7.8 ფაილის დაწერა

ფაილის დასაწერად ფაილი უნდა გახსნათ 'w' ხერხით. 'w' - როგორც მეორე პარამეტრი:

>>> fout = open('output.txt', 'w')
>>> print fout
<open file 'output.txt', mode 'w' at 0xb7eb2410>

ფაილი თუ უკვე არსებობს,  ამ მეთოდით გახსნა ფაილში ძველ მონაცემებს წაშლის, ასე რომ ყურადღებით! თუ არ არსებობს, გაკეთდება ახალი ფაილი.
write მეთოდი of the file handle object puts data into the file.

>>> line1 = 'This here's the wattle,\n'
>>> fout.write(line1)

ობიექტური ფაილი მიიდევნება სადაც არის, ასე რომ შეგიძლია ისევ გამოიძახო write, რომელიც ახალ მონაცემებს დაამატებს ძველი მონაცემების ბოლოში.
უნდა ვაკონტროლოთ სად მთავრდება ხაზები ახალი ხაზის სიმბოლოთი. print ბრძანება ავტომატურად ჩასვამს ახალ ხაზს, მაგრამ write მეთოდი ავტომატურად არ ამატებს ახალ ხაზს.

>>> line2 = 'the emblem of our land.\n'
>>> fout.write(line2)

როცა წერას მორჩები, ფაილი უნდა დახურო, რათა დარწმუნდე, რომ დისკზე ფიზიკურად ჩაიწერა და ენერგიის გამორთვის შემთხვევაში არ დაიკარგება.

>>> fout.close()

ასევე უნდა დავხუროთ ფაილები, რომელიც წასაკითხად გავხსენით, მაგრამ შეგვიძლია ვიყოთ ცოტა დაუდევარი თუ მარტო რამდენიმე ხაზს ვხსნით, ვინაიდან როცა პროგრამა მთავრდება პითონი თვითონ ხურავს გახსნილ ფაილებს. როცა ფაილებს ვწერთ, ფაილები აუცილებლად უნდა დავხუროთ.