Python不读取整个文本文件

时间:2012-03-28 10:45:17

标签: python text filesize file-io

我遇到了一个问题,我没有在StackOverflow上遇到任何人,甚至谷歌就此问题。

我的主要目标是能够用另一个字符串替换文件中字符串的出现。有没有办法能够访问文件中的所有行。

问题在于,当我尝试读取大文本文件(1-2 gb)的文本时,python只读取它的一个子集。

例如,我会做一个非常简单的命令,例如:

newfile = open("newfile.txt","w")
f = open("filename.txt","r")
for line in f:
    replaced = line.replace("string1", "string2")
    newfile.write(replaced)

它只写入原始文件的前382 MB。以前有人遇到过这个问题吗?

我尝试了一些不同的解决方案,例如使用:

import fileinput
for i, line in enumerate(fileinput.input("filename.txt", inplace=1)
   sys.stdout.write(line.replace("string1", "string2")

但它有同样的效果。也不会使用

等块来读取文件
f.read(10000)

我把它缩小到很大程度上是一个问题的解读而不是写作问题,因为它只是打印出来的。我知道还有更多的线条。当我在像Vim这样的全文编辑器中打开它时,我可以看到最后一行应该是什么,并且它不是python打印的最后一行。

任何人都可以提供任何建议或尝试吗?

我目前正在使用32位版本的Windows XP,内存为3.25 GB,并运行Python 2.7

*找到编辑解决方案(感谢Lattyware)。使用迭代器

def read_in_chunks(file, chunk_size=1000): 
   while True: 
      data = file.read(chunk_size) 
      if not data: break 
      yield data

3 个答案:

答案 0 :(得分:23)

尝试:

f = open("filename.txt", "rb")

在Windows上,rb表示以二进制模式打开文件。根据文档,文本模式与二进制模式仅对行尾字符有影响。但是(如果我没记错的话)我认为在Windows上以文本模式打开文件也可以使用EOF(hex 1A)。

您还可以在使用fileinput时指定模式:

fileinput.input("filename.txt", inplace=1, mode="rb")

答案 1 :(得分:2)

你确定问题在于阅读而不是写出来吗? 您是否明确newfile.close()或使用with构造关闭了写入的文件?

当缓冲在某个地方进行时,不关闭输出文件通常是此类问题的根源。如果您的设置也是如此,那么关闭应该会修复您的初始解决方案。

答案 2 :(得分:1)

如果你使用这样的文件:

with open("filename.txt") as f:
    for line in f:
        newfile.write(line.replace("string1", "string2"))

它应该一次只读入一行内存,除非你在内存中保留对该行的引用 在读取每一行之后,将由pythons垃圾收集器来消除它。尝试一下,看看它是否适合你:)