2015-06-11 6 views
4

Я начинаю использовать Python (я использую 3.4). Это важная часть моего кода.UnicodeDecodeError при чтении текстового файла

fileObject = open("countable nouns raw.txt", "rt") 
bigString = fileObject.read() 
fileObject.close() 

Всякий раз, когда я пытаюсь прочитать этот файл я получаю:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 82273: character maps to <undefined> 

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

import codecs 
f = codecs.open("file.txt", "r", "utf-8") 

Но вы должны знать это заранее. Дело в том, что я не знаю, как закодирован текстовый файл. Несколько советов, предложенных с использованием Chardet. Я установил его, но я понятия не имею, как заставить его читать текстовый файл.

Любые идеи о том, как обойти это?

ответ

1

Нет необходимости использовать codecs.open(); это совет для Python 2.

В Python 3 open() принимает encoding аргумент:

fileObject = open("countable nouns raw.txt", "rt", encoding='utf8') 

Это требует, чтобы вы знаете, какой кодек был использован для файла, конечно. Вообще говоря, это не простой способ для Python понять это; отдельные форматы файлов могут включать в себя информацию о кодеке или стандартизоваться на данном кодеке, но если у вас есть общий текстовый файл, вам придется выяснить, что его создало, и какой кодек, который использовался для записи данных.

0

В дополнение к использованию правильного метода Python для указания кодировки при использовании open, вы можете попробовать получить кодировку с помощью инструмента file.

Файл, содержащий foo.txt

ÙÚÛÜ 

можно проверить с помощью

$ file foo.txt 
foo.txt: UTF-8 Unicode text 
$ wc foo.txt 
1 1 9 foo.txt 

Как вы можете видеть, используя wc, он содержит девять байт, два для каждого символа, один символ новой строки.

+0

Есть ли файл на окнах? –

+0

Я так не думаю.Возможно, [Cygwin] (https://www.cygwin.com/) включает его. –

0

Одним из способов обнаружения кодировки в любой операционной системе является использование библиотечного набора. Если у вас его нет, убедитесь, что вы запустили комплект поставки pip install. После этого это довольно просто:

import chardet 
import requests 
content = requests.get("http://yahoo.co.jp/").content 
detect = chardet.detect(content) 
print(detect) 

Эта библиотека пытается определить, что такое кодировка. Это не означает, что он на 100% прав, просто, скорее всего, будет правильным. Затем вы можете просто прочитать файл:

open('file.txt', encoding=detect['encoding'])