Выполняет ли итерация файлового объекта Python предварительную загрузку следующих строк в фоновом режиме?Python

Программы на Python
Ответить
Anonymous
 Выполняет ли итерация файлового объекта Python предварительную загрузку следующих строк в фоновом режиме?

Сообщение Anonymous »

У меня возникли проблемы при открытии txt файла с помощью Python. Файл, который я открываю, содержит следующий байт 0xd1, который в ASCII равен Ñ. Когда я открываю файл с кодировкой по умолчанию для моей системы (utf-8), появляется следующая ошибка.

Код: Выделить всё

Traceback (most recent call last):
File "c:\app.py", line 7, in 
for line in f:
File "", line 322, in decode
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 2308: invalid continuation byte
Если в моем файле мало строк (я считаю, что правильный термин — «несколько байтов или информации»), ошибка появляется, как только я открываю файл. Однако если мой файл большой, я могу перебрать некоторые строки файла, прежде чем появится ошибка.
Это пример кода:

Код: Выделить всё

with open("file.txt", "wb") as f:
f.write(b"Hello, World!\r\n")
f.write(b"\xd1\r\n")

with open("file.txt", "r", encoding="utf-8") as f:
for i, line in enumerate(f):
print(i, line)
с этим кодом, как только я начинаю перебирать файл, появляется ошибка:

Код: Выделить всё

Traceback (most recent call last):
File "c:\app.py", line 6, in 
for i, line in enumerate(f):
File "", line 322, in decode
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 15: invalid continuation byte
Но если я добавлю больше строк (байтов) перед записью байта 0xd1, я смогу перебрать несколько строк до появления ошибки:

Код: Выделить всё

with open("file.txt", "wb") as f:
f.write(b"Hello, World!\r\n" * 700)
f.write(b"\xd1\r\n")

with open("file.txt", "r", encoding="utf-8") as f:
for i, line in enumerate(f):
print(i, line)
выдает следующий результат:

Код: Выделить всё

544 Hello, World!

545 Hello, World!

Traceback (most recent call last):
File "c:\app.py", line 6, in 
for i, line in enumerate(f):
File "", line 322, in decode
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 2308: invalid continuation byte
Ошибка появляется до достижения строки, где находится проблемный байт, что заставляет меня думать, что Python предварительно загружает файл в фоновом режиме во время его прохода, но я не могу ничего найти в документы.
Также в качестве бонуса эта ошибка появляется при смене версии с Python 2.6 на Python 3.6. Почему в предыдущей версии не было ошибок?

Подробнее здесь: https://stackoverflow.com/questions/792 ... background
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»