OSError: [Errno 22] Недопустимый аргумент при чтении файлов построчно с использованием Python - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь избавиться от некоторых строк ошибок в очень большом файле (200 ГБ в Windows), код в основном выглядит следующим образом

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

Однако я получил это OSError: [Errno 22] Invalid argument из строки line = next(fi) внутри блока try после обработки около 30 ГБ данных. Какова возможная причина этого? как я мог справиться с этим?

Также я заметил странное поведение выделения памяти вокруг этой точки: сначала он увеличивается до полного объема памяти, а затем снижается до исходного уровня, хотя я не знаю, является ли это уместным или просто совпадением.

Полная трассировка стека

Traceback (most recent call last):
  File "C:/Users/concat_split_files.py", line 23, in <module>
    line = next(fi)
OSError: [Errno 22] Invalid argument

РЕДАКТИРОВАТЬ Вот точный код, основное отличие в том, что, поскольку я уже успешно проверил часть файла, я пропустил первые несколько строк (30 ГБ).

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 голосов
/ 21 ноября 2018

Оказалось, файл был неполным.Поэтому я думаю, что в какой-то момент фактические данные заканчиваются без переноса строки, тогда программа просто продолжала читать файл, пока память не взорвалась и не выдавала эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...