UnicodeDecodeError при чтении файла словарных слов простым скриптом Python - PullRequest
0 голосов
/ 19 июня 2009

Впервые делаю Python через некоторое время, и у меня возникают проблемы при простом сканировании файла, когда я запускаю следующий скрипт с Python 3.0.1,

with open("/usr/share/dict/words", 'r') as f:
   for line in f:
       pass

Я получаю это исключение:

Traceback (most recent call last):
  File "/home/matt/install/test.py", line 2, in <module>
    for line in f:
  File "/home/matt/install/root/lib/python3.0/io.py", line 1744, in __next__
    line = self.readline()
  File "/home/matt/install/root/lib/python3.0/io.py", line 1817, in readline
    while self._read_chunk():
  File "/home/matt/install/root/lib/python3.0/io.py", line 1565, in _read_chunk
    self._set_decoded_chars(self._decoder.decode(input_chunk, eof))
  File "/home/matt/install/root/lib/python3.0/io.py", line 1299, in decode
    output = self.decoder.decode(input, final=final)
  File "/home/matt/install/root/lib/python3.0/codecs.py", line 300, in decode
   (result, consumed) = self._buffer_decode(data, self.errors, final)
 UnicodeDecodeError: 'utf8' codec can't decode bytes in position 1689-1692: invalid data

Строка в файле, над которым он взорван, является "аргентинской", что, похоже, не является чем-то необычным.

Обновление : я добавил,

encoding="iso-8559-1"

на вызов open (), и это решило проблему.

Ответы [ 2 ]

1 голос
/ 19 июня 2009

Как вы определили из "позиции 1689-1692", какую строку в файле он взорвал? Эти числа будут смещены в блоке, который он пытается декодировать. Тебе пришлось бы определить, какой это был кусок - как?

Попробуйте в интерактивном режиме:

buf = open('the_file', 'rb').read()
len(buf)
ubuf = buf.decode('utf8')
# splat ... but it will give you the byte offset into the file
buf[offset-50:60] # should show you where/what the problem is
# By the way, from the error message, looks like a bad
# FOUR-byte UTF-8 character ... interesting
1 голос
/ 19 июня 2009

Можете ли вы проверить, чтобы убедиться, что это действительно UTF-8? Способ сделать это дан на этом вопросе SO :

iconv -f UTF-8 /usr/share/dict/words -o /dev/null

Есть и другие способы сделать то же самое.

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