更改文本文件时的UnicodeDecodeError

时间:2015-12-11 12:34:34

标签: python unicode

我正在编写一个程序,它接受一个文本文件并生成另一个文本文件,其中: 1.瑞典字母格式正确。 2.删除所有非字母的单词。 3.所有大写字母都已转换为小写字母。

这是我的代码:

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文件中找到这个段,我希望看到在oreoljor之后产生错误的那个词(对吧?),但是我看到了这个:

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

mineraloljor之后,有MAYHEM。我不明白为什么这个词应该导致错误,它没有什么不同!

如何解决此错误并继续格式化整个文件?

3 个答案:

答案 0 :(得分:2)

所以我找到了解决这个问题的简单方法。我用sublime text 2打开了我的wfreq文件,我可以用编码utf-8保存它。这本身就解决了瑞典字母问题。我还将扩展名更改为.txt。之后我再次运行python代码(更改了文件名并删除了åäö-part)并且工作正常。

答案 1 :(得分: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

答案 2 :(得分:0)

如果f√∂gl√∂mma在您的示例文件中并且应该读取föglömma,但您的Python脚本认为它不是UTF-8,那么您已将错误的编码移动到{{1文件。

在某些时候,UTF-8数据被解释为mac-roman,然后保存为mac-roman。

通过再次将文件保存为UTF-8,您可以进一步了解以前的错误。