Python不读取整个文本文件

use*_*872 13 python file-io text filesize

我遇到了一个问题,我没有在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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

但它具有相同的效果.也不会以诸如使用的方式读取文件

f.read(10000)
Run Code Online (Sandbox Code Playgroud)

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

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

我目前正在使用32位版本的Windows XP,3.25 GB的ram,并运行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
Run Code Online (Sandbox Code Playgroud)

cod*_*ape 23

尝试:

f = open("filename.txt", "rb")
Run Code Online (Sandbox Code Playgroud)

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

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

fileinput.input("filename.txt", inplace=1, mode="rb")
Run Code Online (Sandbox Code Playgroud)


Ser*_*lis 1

如果您像这样使用该文件:

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

它一次只能读入内存一行,除非您在内存中保留对该行的引用。
读取每一行后,将由 python 垃圾收集器将其删除。尝试一下,看看它是否适合您:)