Friday, July 10, 2015

თავი 7 (7,5 - 7,6)



7.5 ფაილში ძებნა

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

fhand = open('mbox-short.txt')
for line in fhand:
      if line.startswith('From:'):
            print line

პროგრამის გაშვება მოგვცემს შემდეგ შედეგს:

From: stephen.marquard@uct.ac.za

From: louis@media.berkeley.edu

From: zqian@umich.edu

From: rjlowe@iupui.edu
...

შედეგი გამოიყურება შესანიშნავად, ვინაიდან ვხედავთ მხოლოდ იმ ხაზებს, რომელიც იწყება "From: - ით", მაგრამ რატომ ვხედავთ დამატებით ცარიელ ხაზებს? ესაა "უხილავი" ახალი ხაზის სიმბოლოს გამო. ყოველი ხაზი მთავრდება ამ სიმბოლოთი და print ბრძანება ცვლადში line ბეჭდავს სტრინგს, რომელიც შეიცავს ახალ ხაზს და შემდეგ print ამატებს სხვა ახალ ხაზს, როგორც ვხედავთ შედეგია ორმაგი ეფექტი.
ჩვენ შეგვეძლო გამოგვეყენებინა ხაზის დაჭრა რომ ყველაფერი ამოგვებეჭდა but the last character, მაგრამ უფრო მარტივია გამოვიყენოთ rstrip მეთოდი რომელიც აცლის ჰარებს სტრინგს მარჯვენა მხრიდან:

fhand = open('mbox-short.txt')
for line in fhand:
            line = line.rstrip()
      if line.startswith('From:') :
            print line
პროგრამის გაშვების შემდეგ მივიღებთ შემდეგ ამონაბეჭდს:

From: stephen.marquard@uct.ac.za
From: louis@media.berkeley.edu
From: zqian@umich.edu
From: rjlowe@iupui.edu
From: zqian@umich.edu
From: rjlowe@iupui.edu
From: cwen@iupui.edu
...

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

fhand = open('mbox-short.txt')
for line in fhand:
            line = line.rstrip()
            # Skip 'uninteresting lines'
            if not line.startswith('From:') :
                        continue
            # Process our 'interesting' line
            print line

ამ პროგრამის ამონაბეჭდი არის იგივე.  არასაინტერესო ხაზებია რომელიც არ იწყება From: - ით". რომელზე გადასახტომადაც ვიყენებთ continue - ს და საინტერესო ხაზები (ე.ი. რომელიც იწყება “From: - ით".)  დამუშავდება.
შეგვიძლია გამოვიყენოთ find სტრინგ მეთოდი ტექსტური რედაქტორის იმიტირებისათვის , რომელიც პოულობს ხაზებს. ვინაიდან find ეძებს შემთხვევით სტრინგს სხვა სტრინგში და აბრუნებს სტრინგის პოზიციას ან -1 - ს თუ სტრინგი ვერ იპოვნა. შეგვიძლია დავწეროთ მარყუჟი, რომ ვნახოთ ხაზები, რომელიც შეიცავს სტრინგს “@uct.ac.za” (ეს მოდის სამხრეთ აფრიკის კეიპ თაუნის უნივერსიტეტიდან):

fhand = open('mbox-short.txt')
for line in fhand:
            line = line.rstrip()
            if line.find('@uct.ac.za') == -1 :
                        continue
            print line

რომელსაც ექნება ესეთი ამონაბეჭდი:

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
X-Authentication-Warning: set sender to stephen.marquard@uct.ac.za using -f
From: stephen.marquard@uct.ac.za
Author: stephen.marquard@uct.ac.za
From david.horwitz@uct.ac.za Fri Jan 4 07:02:32 2008
X-Authentication-Warning: set sender to david.horwitz@uct.ac.za using -f
From: david.horwitz@uct.ac.za
Author: david.horwitz@uct.ac.za
...

7.6 მომხმარებელი ირჩევს ფაილის სახელს

ნამდვილად არ გვინდა, რომ ყოველ ჯერზე ჩვენი კოდი იყო დასარედაქტირებელი. ჩვენ გინდა, რომ დავამუშავოთ ახალი ფაილი. უფრო სასარგებლო იქნებოდა  პროგრამის გაშვებისას მომხმარებლისთვის  გვეკითხა ფაილის სახელი, ამგვარად მათ შეეძლებათ გამოიყენონ ჩვენი პროგრამა სხვადასხვა ფაილებთან პითონის კოდის შეცვლის გარეშე. ამის გაკეთება საკმაოდ მარტივია raw_input - ის გამოყენებით:

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

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

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

python search6.py
Enter the file name: mbox-short.txt
There were 27 subject lines in mbox-short.txt

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