我會用在這裏的講話使用,如果你使用python的舊版本,你需要導入:
from __future__ import with_statement
爲實際的代碼,如果你能負擔得起加載整個文件到內存的兩倍(即,它是非常小的),我這樣做:
def main():
with open('C:\Users\Notandi\Desktop\patriline.txt', 'r') as f:
strings = f.read().split('\t')
for father, son in zip(string, string[1:]):
print "%s \t %s" % (father, son)
main()
這樣,你跳過具有開銷太大了不包括在結束無子女的葉子,這是思考的最後一行是什麼你問(?)
作爲一點切線:如果文件非常大,您可能不想將整個內容加載到內存中,在這種情況下,您可能需要一個生成器。如果你實際上打印了所有東西,你可能不需要這樣做,但是如果這是問題的一些簡化版本,這就是我如何使用發生器來分割文件的方法:
class reader_and_split():
def __init__(self, fname, delim='\t'):
self.fname = fname
self.delim = delim
def __enter__(self):
self.file = open(self.fname, 'r')
return self.word_generator()
def __exit__(self, type, value, traceback):
self.file.close()
def word_generator(self):
current = []
while True:
char = self.file.read(1)
if char == self.delim:
yield ''.join(current)
current = []
elif not char:
break
else:
current.append(char)
生成器的值是,在文件上運行拆分之前,不會將文件的全部內容加載到內存中,這對於非常大的文件來說可能很昂貴。爲了簡單起見,此實現僅允許使用單個字符分隔符。這意味着所有你需要做的,解析出一切是使用發電機,一個快速骯髒的方式做到這一點是:
with reader_and_split(fileloc) as f:
previous = f.next()
for word in f:
print "%s \t %s" % (previous, word)
previous = word
downvoting和不評論爲什麼,有什麼可怕的習慣... – juliomalegria 2012-01-05 22:23:54
@julio:非常真正。 upvoted至少補償一點。 – 2012-01-05 22:25:13
在這種情況下,你只是僥倖避開它,但單引號和雙引號的Python字符串中的反斜槓引入了轉義碼。如果文件名是,例如'another.txt','\ a'會被轉換成不可打印的字符,並且文件不會打開。養成加倍反斜槓的習慣,或者對Windows文件路徑使用r前綴原始字符串('r「C:\ blahblah \ whatever.txt」)。即使在Windows上,您也可以在文件路徑中使用正斜槓。 – 2012-01-05 23:06:40