2016-06-04 5 views
1

Я пытаюсь читать из словаря rockyou и записывать все слова, которые составляют> = 8 символов в новый файл.UnicodeEncodeError при чтении файла

Вот код -

def main(): 
    with open("rockyou.txt", encoding="utf8") as in_file, open('rockout.txt', 'w') as out_file: 
     for line in in_file: 
      if len(line.rstrip()) < 8: 
       continue 
      print(line, file = out_file, end = '') 
     print("done") 

if __name__ == '__main__': 
    main() 

Некоторые слова не UTF-8.

Traceback (most recent call last): File "wpa_rock.py", line 10, in <module> main() File "wpa_rock.py", line 6, in main print(line, file = out_file, end = '') File "C:\Python\lib\encodings\cp1252.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: 'charmap' codec can't encode character '\u0e45' in position 0: character maps to <undefined>

Update

def main(): 
with open("rockyou.txt", encoding="utf8") as in_file, open('rockout.txt', 'w', encoding="utf8") as out_file: 
    for line in in_file: 
     if len(line.rstrip()) < 8: 
      continue 
     out_file.write(line) 
    print("done") 

if __name__ == '__main__': 
    main()``` 

Traceback (most recent call last): File "wpa_rock.py", line 10, in <module> main() File "wpa_rock.py", line 3, in main for line in in_file: File "C:\Python\lib\codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 933: invali d continuation byte

+1

Это опечатка. Это должно быть 'utf-8' вместо' utf8' – Arpan

+0

Я не знаю, если это так. Использование результатов в одну и ту же ошибку. –

+0

У вас должен быть недопустимый символ в этой позиции. Вы должны показать файл, который вы пытаетесь прочитать. – Arpan

ответ

1

Ваша ошибка UnicodeEncodeError: 'charmap' происходит во время написания к out_fileprint()).

По умолчанию open() использует locale.getpreferredencoding(), который ANSI кодовая на ОС Windows (например, cp1252), которые не могут представлять все символы Unicode и '\u0e45' характер, в частности. cp1252 - однобайтная кодировка, которая может представлять не более 256 разных символов, но есть миллион (1114111) символов Юникода. Он не может представлять их всех.

Pass encoding, который может представлять все необходимые данные, например, encoding='utf-8' должен работать (как @robyschek suggested) -если ваш код читает utf-8 данные без каких-либо ошибок, то код должен иметь возможность записывать данные, используя utf-8 тоже.


Ваша ошибка UnicodeDecodeError: 'utf-8' происходит во время чтения in_file (for line in in_file). Не все байтовые последовательности действительны utf-8, например, os.urandom(100).decode('utf-8') может не работать. Что делать, зависит от приложения.

Если вы ожидаете, что файл будет зашифрован как utf-8; вы можете передать параметр errors="ignore"open(), чтобы игнорировать случайные недействительные байтовые последовательности. Или вы можете использовать some other error handlers depending on your application.

Если фактическая кодировка символов, используемая в файле, различна, вы должны передать фактическую кодировку символов. bytes сами по себе не имеют никакого кодирования-что метаданные должны поступать из другого источника (хотя some encodings are more likely than others: chardet can guess), например, если содержимое файла затем тело HTTP см A good way to get the charset/encoding of an HTTP response in Python

Иногда сломанный программное обеспечение может генерировать в основном UTF-8 последовательности байтов с некоторые байты в другой кодировке. bs4.BeautifulSoup can handle some special cases. Вы также можете указать try ftfy utility/library и посмотреть, поможет ли это в вашем случае, например, ftfy may fix some utf-8 variations.

+0

Обновлен вопрос. –

Смежные вопросы