Python 不读取整个文本文件

Posted

技术标签:

【中文标题】Python 不读取整个文本文件【英文标题】:Python Does Not Read Entire Text File 【发布时间】:2012-03-28 10:45:17 【问题描述】:

我遇到了一个问题,我没有看到任何人在 *** 上遇到过,甚至没有在谷歌上看到过。

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

问题是当我尝试读取一个大文本文件(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

【问题讨论】:

使用迭代器逐行读取应该是一种惰性操作,因此无论文件大小如何,它都应该工作。虽然它不应该影响您的情况,但您还需要在打开文件时使用 with - 这是一个很好的做法,而不是在异常情况下正确处理关闭。 效果很好!非常感谢。 *编辑:我尝试在这里发布迭代器代码,但它不会格式化,所以我将它添加到原始帖子中。 您是否尝试过使用不同的大文本文件?文件 382mb 中有什么奇怪的地方 - 一些奇怪的字符被视为文件的结尾? 我有。起初我以为它可能是该文件,但我尝试使用来自各种来源的不同大小的文件。我试过的大的是 2.6 GB,我试过的最小的是 560 mb,但它们都停在 382 mb。 您的原始代码没有理由不工作。正如@Latty 所说,它也是“懒惰的”。您不需要编写自己的迭代器或分块读取。 【参考方案1】:

试试:

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

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

使用fileinput时也可以指定模式:

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

【讨论】:

这也行得通!我最喜欢这个解决方案,因为更改现有代码是多么容易。 如何“这也有效”?这显然是你的问题。还有什么其他方法也有效?啊,我在 cmets 中看到,指定要读取的字节长度,而不是使用“readline” 我遇到了完全相同的问题。效果很好!【参考方案2】:

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

在某处进行缓冲时,不关闭输出文件通常是此类问题的根源。如果您的设置也是这种情况,那么关闭应该可以解决您的初始解决方案。

【讨论】:

【参考方案3】:

如果你像这样使用文件:

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

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

【讨论】:

以上是关于Python 不读取整个文本文件的主要内容,如果未能解决你的问题,请参考以下文章

delphi读取文本问题

在scala中读取文本文件,一行接一行,不迭代

读取存储在文本文件中的列表[重复]

python文本内容替换?

从文本文件中读取第一行而不将整个文本文件加载到内存中

如何读取用 7z 压缩的文本文件?