2012-04-17 37 views
10

其他分隔阅读Python中的循环文件我通常在Python这样写的文件:有没有办法使用的不是换行符

f = open('filename.txt', 'r') 
for x in f: 
    doStuff(x) 
f.close() 

然而,这种分裂由换行符的文件。我现在有一个文件,它的所有信息都在一行中(45,000个字符串用逗号分隔)。虽然这种大小的文件是平凡中使用类似

f = open('filename.txt', 'r') 
doStuff(f.read()) 
f.close() 

我好奇地看,如果一个更大的文件,这是所有在同一行,将有可能达到类似的迭代效果第一代码片段,但用逗号而不是换行符或其他任何字符进行分割?

+0

可能的重复:。在那里给出通过继承'file'对象的解决方案。 – ely 2012-04-17 01:41:25

+0

是的,这正是我一直在寻找的,谢谢! – vasek1 2012-04-17 01:45:37

+0

一旦你完成了关闭()文件对象,通常是一个好主意。 – 2012-04-17 01:52:22

回答

8

以下功能是做自己想做的一个相当简单的方法:

def file_split(f, delim=',', bufsize=1024): 
    prev = '' 
    while True: 
     s = f.read(bufsize) 
     if not s: 
      break 
     split = s.split(delim) 
     if len(split) > 1: 
      yield prev + split[0] 
      prev = split[-1] 
      for x in split[1:-1]: 
       yield x 
     else: 
      prev += s 
    if prev: 
     yield prev 

你会使用这样的:

for item in file_split(open('filename.txt')): 
    doStuff(item) 

这应该是比EMS链接的解决方案快,并且会为大文件一次性读取整个文件而节省大量内存。

+0

bufsize是否需要与项目本身一样大或者只是分隔符? – sashoalm 2016-08-28 11:38:33

1

使用open()打开文件,然后使用file.read(x)方法从文件中读取(大约)下一个x字节。您可以继续请求4096个字符的块,直到达到文件结尾。

你必须实现自我分裂 - 你可以从csv模块中获得灵感,但我不相信你可以直接使用它,因为它不是为了处理极长的线条而设计的。

+1

你可以用Python 2或3上的文件对象来做到这一点。没有理由使用'io'。另外,为了清楚起见,文件对象是您在调用“open”时获得的内容。不要使用内置的实际'file'。 – agf 2012-04-17 01:17:01

+0

@agf - 编辑。更好? – 2012-04-17 01:22:29

相关问题