Python无法读取完整的文本文件

15

我遇到了一个问题,似乎在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.25GB的RAM,并运行Python 2.7。


1
使用迭代器逐行读取应该是一种惰性操作,因此它应该可以处理任何大小的文件。虽然这不会影响您的情况,但在打开文件时,您还应该使用“with”关键字 - 这是一个良好的实践,可以正确处理异常关闭。 - Gareth Latty
太好了,那个很有效!非常感谢。*编辑:我试图在这里发布迭代器代码,但它无法格式化,所以我将其添加到原始帖子中。 - user1297872
你尝试过使用其他大型文本文件吗?382mb的文件中是否有一些奇怪的字符被视为文件结尾? - neil
我有。一开始我以为可能是文件的问题,但我试过了来自不同来源、大小不同的文件。我试过的最大的文件是2.6 GB,最小的是560 MB,但它们都在382 MB处停止了。 - user1297872
相关问题:读取行时遇到0x1A字符的错误 - Janne Karila
显示剩余2条评论
4个回答

24

尝试:

f = open("filename.txt", "rb")
在Windows系统中,rb 表示以二进制模式打开文件。根据文档说明,文本模式与二进制模式只对换行符有影响。但我记得(如果没记错的话),在Windows系统上以文本模式打开文件也会对EOF(十六进制1A)进行处理。
同时,在使用fileinput时也可以指定模式。
fileinput.input("filename.txt", inplace=1, mode="rb")

那也可以!我最喜欢那个解决方案,因为它可以很容易地改变现有的代码。 - user1297872
“那也可以运行”是怎么回事?这显然是你的问题。还有其他什么方法也能起作用吗?啊,我在评论中看到了,指定要读取的字节长度,而不是使用“readline”。 - jsbueno
我遇到了完全相同的问题。它完美地工作! - Tao Chen

4

您确定问题是读取而不是写出吗?您是否关闭了被写入的文件,明确地使用newfile.close()或使用with结构?

当缓冲区发生某些情况时,不关闭输出文件通常是此类问题的根源。如果在您的设置中也是如此,则关闭应该可以解决您的初始解决方案。


1
如果您像这样使用文件:
with open("filename.txt") as f:
    for line in f:
        newfile.write(line.replace("string1", "string2"))

它应该一次只读入一行到内存中,除非你在内存中保留对该行的引用。
每读取一行后,由Python垃圾收集器来清除它。试试看这是否适用于你 :)


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接