В Python 2.7 на Mac я печатаю имена файлов, полученные с помощью PlaintextCorpusReader nltk:
infobasecorpus = PlaintextCorpusReader(corpus_root, '.*\.txt')
for fileid in infobasecorpus.fileids():
print fileid
и получите UnicodeDecodeError: 'ascii', '100316-N1-The \xc2\xa3250bn cost of developing.txt', 14, 15, 'ordinal not in range(128)'
из-за символа £
в имени файла.
Как я понимаю, fileid
- это строка в кодировке Unicode, которую мне нужно кодировать в кодировку по умолчанию, прежде чем я смогу ее распечатать, а кодировкой по умолчанию является ASCII.
Если я использую print fileid.encode('ascii', 'ignore')
, я получаю ту же ошибку.
Если я изменю кодировку по умолчанию, установив encoding = "utf-8"
в site.py
, (согласно этому совету ) это сработает.
Может кто-нибудь сказать мне:
(а) почему encode
не удалось
(б) почему encoding
работает и
(c) что я должен делать, если я делаю что-то здесь не так? (Например, это описывает настройку кодировки по умолчанию как «некрасивый хак», который приводит к неправильному использованию строк и созданию глючного кода.)
(Отказ от ответственности: новичок в Python, очень благодарен за ваше терпение, если это очевидно)
===========================================
Обновление для ответа Робу:
Роб, вот полный текст тестового кода:
import sys
import os
from nltk.corpus import PlaintextCorpusReader
corpus_root = '/Users/richlyon/Documents/Filing/Infobase/'
infobasecorpus = PlaintextCorpusReader(corpus_root, '.*\.txt')
for fileid in infobasecorpus.fileids():
print type(fileid) # result <type 'str'>
fileid = fileid.decode('utf8')
print type(fileid) # result <type 'unicode'>
print fileid.encode('ascii')
Я установил кодировку по умолчанию обратно на ascii
и запустил ее.
print fileid.encode('ascii')
все еще терпит неудачу на £
в имени файла.
===========================================
Последнее обновление на случай, если это кому-нибудь поможет.
Мне нужно было написать:
fileid = fileid.decode('utf8')
print fileid.encode('ascii', 'ignore')
но text = nltk.Text(infobasecorpus.words(fileid))
дросселирует, если на него подается <type 'unicode'>
строк, что, кажется, противоречит рекомендации немедленно преобразовать все в unicode перед дальнейшей обработкой.
Но теперь это работает. Спасибо всем, и Робу в частности.