替换大型 txt 文件中的字符串时如何绕过内存错误?
How to bypass memory error when replacing a string in a large txt file?
我有几个文件要遍历,其中一些文件长达数百万行。一个文件可以超过 500 MB。我需要通过搜索 '| |'
字符串并将其替换为 '|'
字符串来准备它们。
但是,以下代码遇到“内存错误”。如何修改代码以逐行搜索和替换文件以节省 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 = ""
此代码在内存中一次读取一行。
它将结果存储在buffer
中,一次最多包含chunk_size
行,之后将结果保存到文件并清理buffer
。如此往复直到文件结束。在读取循环结束时,如果缓冲区包含行,则将其写入磁盘。
这样,除了查看内存中的行数外,还查看磁盘写入数。每次读取一行都写入文件可能不是一个好主意,而且 chunk_size
太大了。您可以找到适合您问题的 chunk_size
值。
注意:您可以使用open()
buffering 参数,以获得相同的结果。找到 documentation 中的所有内容。但是逻辑很相似。
我有几个文件要遍历,其中一些文件长达数百万行。一个文件可以超过 500 MB。我需要通过搜索 '| |'
字符串并将其替换为 '|'
字符串来准备它们。
但是,以下代码遇到“内存错误”。如何修改代码以逐行搜索和替换文件以节省 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 = ""
此代码在内存中一次读取一行。
它将结果存储在buffer
中,一次最多包含chunk_size
行,之后将结果保存到文件并清理buffer
。如此往复直到文件结束。在读取循环结束时,如果缓冲区包含行,则将其写入磁盘。
这样,除了查看内存中的行数外,还查看磁盘写入数。每次读取一行都写入文件可能不是一个好主意,而且 chunk_size
太大了。您可以找到适合您问题的 chunk_size
值。
注意:您可以使用open()
buffering 参数,以获得相同的结果。找到 documentation 中的所有内容。但是逻辑很相似。