Friday, July 10, 2015

თავი 7 (7,3 - 7,4)

7.3 ტექსტური ფაილები და ხაზები

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

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>
Date: Sat, 5 Jan 2008 09:12:18 -0500
To: source@collab.sakaiproject.org
From: stephen.marquard@uct.ac.za
Subject: [sakai] svn commit: r39772 - content/branches/
...

მთლიანი ფაილი ხელმისაწვდომია www.py4inf.com/code/mbox.txt და შემოკლებული ვერსია - www.py4inf.com/code/mbox-short.txt . ეს ფაილებია სტანდარტული ფორმატის ფაილები, რომელიც შეიცავს რამდენიმე მესიჯს. ხაზები, რომელიც იწყება "From - ით" ცალკე მესიჯია და ხაზები რომელიც იწყება “From: - ითარის მესიჯების ნაწილი. მეტი ინფორმაციისთვის ნახე en.wikipedia.org/wiki/Mbox.

ფაილის ხაზებად დასაყოფად არსებობს სპეციალური სიმბოლო რომელიც წარმოადგენს 'ხაზის ბოლოს' და ჰქვია ახალი ხაზის სიმბოლო.
პითონში ახალი ხაზის სიმბოლოა backslash-n ( \n ).  გამოიყურება როგორც ორი სიმბოლო, თუმცა სინამდვილეში ერთია. ინტერპრეტერში ცვლადში შეტანილ ხარახურას როცა ვუყურებთ, გვაჩვენებს \n - ს, მაგრამ ამობეჭდვის დროს გვაჩვენებს ორ ხაზზე გაყოფილ სტრინგს:

>>> stuff = 'Hello\nWorld!'
>>> stuff
'Hello\nWorld!'
>>> print stuff
Hello
World!
>>> stuff = 'X\nY'
>>> print stuff
X
Y
>>> len(stuff)
3

შეგიძლია 'X\nY' სტრინგის სიგრძე ნახო. სიგრძეა 3, იმიტომ რომ ახალი ხაზის სიმბოლო არის ერთი სიმბოლო.
ასე რომ, როცა ფაილში ხაზებს ვუყურებთ, უნდა წარმოვიდგინოთ, რომ არის სპეციალური უჩინარი სიმბოლო ყოველი ხაზის ბოლოს, რომელიც აღნიშნავს ხაზის დასასრულს და ჰქვია ახალი ხაზი. ეს სიმბოლო ფაილში სხვა სიმბოლოებს აცალკევებს ხაზებზე.

7.4 ფაილის კითხვა


სანამ ფაილის სათაური არ შეიცავს ფაილის მონაცემებს(While the file handle does not contain the data for the file), ადვილია გავაკეთოთ for მარყუჟი ფაილში ხაზების რაოდენობის დასათვლელად:

fhand = open('mbox.txt')
count = 0
for line in fhand:
      count = count + 1
print 'Line Count:', count

python open.py
Line Count: 132045

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

>>> fhand = open('mbox-short.txt')
>>> inp = fhand.read()
>>> print len(inp)
94626
>>> print inp[:20]
From stephen.marquar

ამ მაგალითში mbox-short.txt ფაილის მთელი შინაარსი (94,626 სიმბოლო) არის წაკითხული  უშუალოდ ცვლადში inp.
როცა ფაილი წაკითხულია ამ ხერხით, ყველა სიმბოლო ხაზების და ახალი ხაზების სიმბოლოების ჩათვლით არის ერთი დიდი სტრინგი მოთავსებული ცვლადში inp. დაიმახსოვრე რომ open ფუნქციის ეს ფორმა  უნდა გამოიყენო მხოლოდ მაშინ თუ ფაილის მონაცემები  კომფორტულია შენი კომპიუტერის ძირითად მეხსიერებასთან. ფაილი თუ ძალიან დიდია, უნდა დაწერო პროგრამა, რომ წაიკითხო ფაილი ნაწილებად for და while მარყუჟის დახმარებით.