我会用在这里的讲话使用,如果你使用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