Python 替换大型txt文件中的字符串时绕过内存错误
我有几个文件要迭代,其中一些长达数百万行。一个文件的大小可以超过500 MB。我需要通过搜索Python 替换大型txt文件中的字符串时绕过内存错误,python,Python,我有几个文件要迭代,其中一些长达数百万行。一个文件的大小可以超过500 MB。我需要通过搜索“| |”字符串并将其替换为“|”字符串来准备它们。但是,下面的代码遇到“内存错误”。如何重新编写代码,逐行搜索和替换文件以保存RAM?有什么想法吗? 这并不是逐行读取大文件,而是逐行替换字符串,避免将列表转换为字符串的问题,反之亦然 import os didi = self.lineEdit.text() for filename in os.listdir(didi):
“| |”
字符串并将其替换为“|”
字符串来准备它们。但是,下面的代码遇到“内存错误”。如何重新编写代码,逐行搜索和替换文件以保存RAM?有什么想法吗?
这并不是逐行读取大文件,而是逐行替换字符串,避免将列表转换为字符串的问题,反之亦然
import os
didi = self.lineEdit.text()
for filename in os.listdir(didi):
if filename.endswith(".txt"):
filepath = os.path.join(didi, filename)
with open(filepath, errors='ignore') as file:
s = file.read()
s = s.replace('| |', '|')
with open(filepath, "w") as file:
file.write(s)
尝试逐行读取文件,而不是一个巨大的块。即
with open(writefilepath, "w", errors='ignore') as filew:
with open(readfilepath, "r", errors='ignore') as filer:
for line in filer:
print("Line {}: {}".format(cnt, line.strip()))
line = line.replace('| |', '|')
filew.write(line)
请尝试以下代码:
chunk_size = 5000
buffer = ""
i = 0
with open(fileoutpath, 'a') as fout:
with open(fileinpath, 'r') as fin:
for line in fin:
buffer += line.replace('| |', '|')
i+=1
if i == chunk_size:
fout.write(buffer)
i=0
buffer = ""
if buffer:
fout.write(buffer)
i=0
buffer = ""
此代码在内存中一次读取一行
它将结果存储在缓冲区中
,一次最多包含块大小
行,然后将结果保存到文件并清理缓冲区
。它一直持续到文件的结尾。在读取循环结束时,如果缓冲区包含行,则将其写入磁盘
这样,除了检查内存中的行数外,还可以检查磁盘写入数。每次读一行时都写入文件可能不是一个好主意,而且块大小过大。这取决于您如何找到适合您的问题的块大小
值
注意:您可以使用
open()
缓冲参数来获得相同的结果。找到里面的一切。但逻辑非常相似。将文件分块处理。打开一个输入和输出文件,一次只能读取N个字符(使用read()
的可选参数)。由于您正在寻找特定的模式,您可能还需要一些额外的逻辑来处理读取之间的边界。如果使用专门用于此任务的现有程序(如sed
),则可能会出现重复,从而为您节省一些麻烦。我还想确保您使用的是64位版本的Python:如果您使用的是32位版本,则内存上限会有所降低。