OSError:[Errno 22]使用Python按行读取文件时,参数无效

时间:2018-11-20 07:42:29

标签: python file io

我正在尝试消除一个非常大的文件(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

1 个答案:

答案 0 :(得分:1)

事实证明文件不完整。因此,我猜测实际数据在某个时刻结束时没有换行符,然后程序将继续读取文件,直到内存耗尽并引发此错误。