2015-12-11 6 views
0

Я пишу программу, которая принимает текстовый файл и создает другой текстовый файл, где: 1. Швейцарские буквы отформатированы правильно. 2. Все слова, которые не являются алфавитами, удаляются. 3. Все заглавные буквы были преобразованы в строчные буквы.UnicodeDecodeError при изменении текстового файла

Это мой код:

import string 

infile = open("unigram.wfreq","r") 
outfile = open("bigram.txt","w") 

line = "Start" 
while line != "": 
    line = infile.readline() 
    wordandcount = line.split() 
    word = wordandcount[0] 
    ##Fix å ä ö. 
    ## å == √• ä == √§ ö == √∂ 
    if "å" in word or "ä" in word or "ö" in word: 
     word = word.replace("√•","å") 
     word = word.replace("√§","ä") 
     word = word.replace("√∂","ö") 
    if word.isalpha(): 
     word = word.lower() 
     outfile.write(word+"\n") 
    print(line) 

А вот пример из моего unigram.wordfreq файла:

gruppselektion 4 
lating 1 
Morsing 2 
varuhusen 7 
FULLT 8 
latino 3 
mammutslätten 2 
föglömma 1 
varuhuset 47 
livsnjutningen 1 
nedtoning 1 

Когда я запускаю файл, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "formater.py", line 13, in <module> 
    line = infile.readline() 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/codecs.py", line 321, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 2732-2733: invalid continuation byte 

Если я смотрю на конец вывода терминала, я вижу следующее:

Omgångsstarten 1 

nationssplittring 1 

Handtvätten 1 

Three 47 

domherre 1 

http://www.dryden.se 1 

Getryggarna 1 

mineraloljor 21 

Если я нахожу этот сегмент в файле unigram.wordfreq я ожидаю увидеть слово, вызвавшего ошибку сразу после mineraloljor (правильно?), Но я вижу это:

Getryggarna 1 
mineraloljor 21 
MAYHEM 1 
avvänjer 1 
tilltrasslad 1 
EUROPEISKT 1 

Сразу после mineraloljor , есть MAYHEM. Я не понимаю, почему это слово должно вызывать ошибку, в этом нет ничего особенного!

Как я могу решить эту ошибку и продолжить форматирование всего файла?

+1

Какая кодировка имеет файл? Похоже, Python пытается прочитать его как UTF-8 и терпит неудачу. – Lav

ответ

2

Итак, я нашел простое решение этой проблемы. Я открыл файл wfreq с возвышенным текстом 2, где я могу сохранить его с помощью кодировки utf-8. Это само по себе решило проблему буквенных букв. Я также изменил расширение на .txt. После этого я снова запустил код python (с измененными именами файлов и удалением å ä ö-part), и он работал нормально.

0

Похоже, что файл кодируется UTF-8, но вы его показываете с использованием кодировки mac_roman. Вот тест:

#coding:utf8 
data = u'mammutslätten föglömma' 
print data.encode('utf8').decode('mac_roman') 

Выход:

mammutslätten föglömma 

Чтобы прочитать файл правильно в Python, используйте следующее для чтения строки Unicode, используя правильную кодировку:

import io 
with io.open('unigram.wfreq',encoding='utf8') as f: 
    for line in f: 
     print line.strip() 

Выход:

gruppselektion 4 
lating 1 
Morsing 2 
varuhusen 7 
FULLT 8 
latino 3 
mammutslätten 2 
föglömma 1 
varuhuset 47 
livsnjutningen 1 
nedtoning 1 
+0

Исключенное исключение показывает, что OP использует Python 3, который уже дал ему декодер UTF-8, но вызывает ошибку при неправильном UTF-8. Единственный способ, которым OP мог получить его результаты, - это файл с мозаикой. Я не думаю, что ваш ответ поможет здесь :( –

0

Если f√∂gl√∂mma находится в вашем файле примера и должен читать föglömma, но ваш скрипт Python не считает UTF-8, то вы внесли неправильный код в свой файл unigram.wfreq.

В какой-то момент данные UTF-8 были интерпретированы как мак-римские, а затем сохранены как мак-римские.

Сохраняя файл снова в UTF-8, вы также испекли предыдущие ошибки.

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