使用Python搜索thorn(þ;)字符并将其替换为Pipe(|)

使用Python搜索thorn(þ;)字符并将其替换为Pipe(|),python,Python,我正在尝试使用python查找thorn“þ”字符,并替换为管道“|”。例如,该文件的内容类似于125650þ383736þ392647。下面是我的代码: f = codecs.open(path, encoding='utf-8', mode='r+') contents = f.read() if u'\u00FE' in contents: print 'Found thorn' 我在contents=f.read()行上出错: UnicodeDecodeError:“utf8”

我正在尝试使用python查找thorn“þ”字符,并替换为管道“|”。例如,该文件的内容类似于125650þ383736þ392647。下面是我的代码:

f = codecs.open(path, encoding='utf-8', mode='r+')
contents = f.read()
if u'\u00FE' in contents:
    print 'Found thorn'
我在contents=f.read()行上出错: UnicodeDecodeError:“utf8”编解码器无法解码位置7中的字节0xfe:无效的开始字节


似乎文件对象f无法解码thorn字符。这里有什么问题?提前感谢

解码错误最常见的原因是您使用了错误的编码。在本例中,您的文件似乎是用Windows-1252或拉丁语-1编码的,而不是UTF-8。我很确定是这样的,因为
0xfe
是这些编解码器的拉丁文小写字母thorn的代码点

例如:

>>> print '125650\xfe383736\xfe3926'.decode('latin-1')
125650þ383736þ3926

您的文件不包含有效的UTF8编码,您的
u'\u00FE'
也不是
þ
的正确UTF8编码:

>>> u'þ'.encode('utf8')
'\xc3\xbe'
看起来您期望的编码是拉丁语-1:

>>> u'þ'.encode('latin-1')
'\xfe'
所以你想要:

f = codecs.open(path, encoding='latin-1', mode='r+')
contents = f.read()
if u'þ' in contents:
    print 'Found thorn'

尝试使用find()函数。该文件实际上是UTF-8编码的吗?如果UTF-8解码器阻塞,则通常表明文件内容采用不同的编码方式进行编码。我猜该文件是用
latin1
编码的,而不是
UTF-8
。如果仅将
utf-8
替换为
latin1
不起作用,请发布文件前8个左右字符的十六进制转储以检查编码。请在open方法上尝试不同的编码。。。