更改文本fi时出现UnicodeDecodeError

2024-09-28 01:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我的代码:

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公司文件:

^{pr2}$

运行该文件时,出现以下错误:

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公司我希望在mineraljor后面看到生成错误的单词(对吗?),但我看到了:

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

mineraloljor之后,有{}。我不明白为什么这个词会引起错误,它没有什么不同!在

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


Tags: 文件in错误字母lineopen单词infile
3条回答

如果f√∂gl√∂mma在示例文件中,并且应该读取föglömma,但是Python脚本认为它不是UTF-8,那么您在unigram.wfreq文件中添加了错误的编码。在

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

通过再次将文件保存到UTF-8,您已经进一步烘焙了以前的错误。在

所以我找到了解决这个问题的简单方法。我用升华文本2打开了我的wfreq文件,在那里我可以用编码utf-8保存它。这就解决了瑞典字母问题。我还将扩展名改为.txt。之后,我再次运行python代码(更改了文件名并删除了åä-part),它运行得很好。在

文件看起来像是用UTF-8编码的,但您使用的是mac_roman编码来显示它。这是一个测试:

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

输出:

^{pr2}$

要在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

相关问题 更多 >

    热门问题