我正在尝试消除一个非常大的文件(Windows为200GB)中的一些错误行,代码基本上如下所示
with open(filename, encoding='utf-8') as fi:
with open(outputfile, 'w', encoding='utf-8') as fo:
while True:
try:
line = next(fi)
fo.write(line)
except UnicodeDecodeError:
line = next(fi)
continue
但是,在处理了大约30GB的数据后,我从try块内的OSError: [Errno 22] Invalid argument
行中获得了此line = next(fi)
。可能的原因是什么?我该怎么处理?
我还注意到这时出现了奇怪的内存分配行为,它首先达到最大内存大小,然后又下降到其原始级别,但是我不知道这是相关的还是偶然的。
完整堆栈跟踪
Traceback (most recent call last):
File "C:/Users/concat_split_files.py", line 23, in <module>
line = next(fi)
OSError: [Errno 22] Invalid argument
编辑,这是确切的代码,主要区别在于,由于我已经成功检查了文件的一部分,因此跳过了前几行(30GB)。
filename = r"data.tsv"
outputfile2 = r"p2.tsv"
line_no = 306878
with open(filename, encoding='utf-8') as fi:
for _ in range(line_no):
try:
next(fi)
except UnicodeDecodeError:
line = next(fi)
print(line)
continue
with open(outputfile2, 'w', encoding='utf-8') as fo2:
while True:
try:
line = next(fi)
fo2.write(line)
except UnicodeDecodeError:
line = next(fi)
print(line)
continue
except StopIteration:
break
答案 0 :(得分:1)
事实证明文件不完整。因此,我猜测实际数据在某个时刻结束时没有换行符,然后程序将继续读取文件,直到内存耗尽并引发此错误。