2013-11-23 3 views
2

С нескольких дней я борюсь с этой досадной проблемой с кодировкой файлов в моей маленькой программе на Python.Python: Ошибки кодирования файлов

Я много работаю с MediaWiki - недавно я конвертирую документы из .doc в Викитека.

Документ в формате Microsoft Word открывается в Libre Office, а затем экспортируется в файл .txt с форматом Викитека. Моя программа ищет тэг [[Image:]] и заменяет его именем изображения, взятого из списка, и этот механизм работает очень хорошо (большое спасибо за помощь brjaga!). Когда я сделал некоторые испытания на .txt файлов, созданных мной все работало нормально, но когда я положил файл .txt с Викитеками все это не так смешно: D

Я получил этот сообщение прома Python:

Traceback (most recent call last): 
    File "C:\Python33\final.py", line 15, in <module> 
    s = ' '.join([line.replace('\n', '') for line in myfile.readlines()]) 
    File "C:\Python33\lib\encodings\cp1250.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 7389: character maps to <undefined> 

и это мой код Python:

li = [ 
    "[[Image:124_BPP_PL_PL_Page_03_Image_0001.jpg]]", 
    "[[Image:124_BPP_PL_PL_Page_03_Image_0002.jpg]]", 
    "[[Image:124_BPP_PL_PL_Page_03_Image_0003.jpg]]", 
    "[[Image:124_BPP_PL_PL_Page_03_Image_0004.jpg]]", 
    "[[Image:124_BPP_PL_PL_Page_03_Image_0005.jpg]]", 
    "[[Image:124_BPP_PL_PL_Page_03_Image_0006.jpg]]", 
    "[[Image:124_BPP_PL_PL_Page_03_Image_0007.jpg]]", 
    "[[Image:124_BPP_PL_PL_Page_05_Image_0001.jpg]]", 
    "[[Image:124_BPP_PL_PL_Page_05_Image_0002.jpg]]" 
    ] 


with open ("C:\\124_BPP_PL_PL.txt") as myfile: 
    s = ' '.join([line.replace('\n', '') for line in myfile.readlines()]) 

dest = open('C:\\124_BPP_PL_PL_processed.txt', 'w') 

for item in li: 
    s = s.replace("[[Image:]]", item, 1) 

dest.write(s) 
dest.close() 

ОК, так что я сделал некоторые исследования и обнаружил, что это проблема с кодировкой. Поэтому я установил программу Notepad ++ и изменил кодировку моего .txt-файла с помощью Wikisource на: UTF-8 и сохранил его. Тогда я сделал некоторые изменения в моем коде:

with open ("C:\\124_BPP_PL_PL.txt", encoding="utf8') as myfile: 
     s = ' '.join([line.replace('\n', '') for line in myfile.readlines()]) 

Но я получил это новое сообщение об ошибке:

Traceback (most recent call last): 
    File "C:\Python33\final.py", line 22, in <module> 
    dest.write(s) 
    File "C:\Python33\lib\encodings\cp1250.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\ufeff' in position 0: character maps to <undefined> 

И я действительно застрял на этом. Я думал, когда я вручную меняю кодировку в Notepad ++, а затем я расскажу о кодировке, которую я установил, - все будет хорошо.

Пожалуйста, помогите, заблаговременно.

+0

Какой кодек сделал Notepad ++ думаю, что это было, когда вы открыли входной файл? Почему вы не использовали эту кодировку для чтения файла (не меняя его на UTF-8) в самом Python? –

+0

Привет, кодек «ANSI as UTF-8» - я не знаю, что это значит, и я не знаю, как установить этот кодек в функции Open() Python, знаете ли вы, что это такое? И как установить его в Python? – exxon

+0

'UTF-8' просто отлично; нет кодека ANSI, на самом деле это просто означает «локальный диалог кодовой страницы Windows», который может быть любым из 'cp1250' и' cp1255' IIRC. –

ответ

2

Когда Python 3 открывает текстовый файл, он использует кодировку по умолчанию для вашей системы, пытаясь декодировать файл, чтобы дать вам полный текст в Юникоде (типполностью известен в Юникоде). Он делает то же самое при написании таких значений текста в Юникоде.

Вы уже решили входную сторону; вы указывали кодировку при чтении. Сделайте то же самое, когда пишет: укажите кодек, который будет использоваться для записи файла, который может обрабатывать Unicode, включая неразрывный символ пробела в кодеге U + FEFF. UTF-8 обычно является хорошим выбором по умолчанию:

dest = open('C:\\124_BPP_PL_PL_processed.txt', 'w', encoding='utf8') 

Вы можете использовать with заявление при написании тоже, и спасти себя .close() вызов:

for item in li: 
    s = s.replace("[[Image:]]", item, 1) 

with open('C:\\124_BPP_PL_PL_processed.txt', 'w', encoding='utf8') as dest:   
    dest.write(s) 
+0

Спасибо! Он отлично работает! – exxon

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