2011-11-20 50 views
0

不知道如何解决UnicodeDecodeError蟒蛇,编解码器,file.writelines()的UnicodeDecodeError

我不能写文本文件 - >UnicodeDecodeError有关字符â = '0xe2'

肯定

1)â = '0xe2'汉字不在该字符串

2)re.search无法找到字符串,而我试图在â字符写file.writelines(string)

3)有定义存在errors='replace'在文件打开,因此file.writelines()不应该抱怨字符错误。

File=codecs.open(fname, 'w','utf-8', errors='replace') 

lines=smart_str(lines, 'utf-8', strings_only=False, errors='replace') 
# lines is 'some webpage text after BeautifulSoup.prettify which does not contain letter â ='0xe2', which is converted with Django smart_str to string' 

FileA.writelines(lines) #gives UnicodeDecodeError : 'ascii' codec can't decode byte 0xe2 in position 9637: ordinal not in range(128). 

myre = re.compile(r'0xe2', re.UNICODE) # letter â = '0xe2' 
print re.search(myre, lines) #gives None 
linessub=myre.sub('', lines) 
print re.search(myre, linessub) #gives None 

FileA.writelines(lines) #gives UnicodeDecodeError : 'ascii' codec can't decode byte 0xe2 in position 9637: ordinal not in range(128). 
+0

如果你想测试一个字符串是否包含一个子,只是在's',而不是这个're'东西“\ XE2”,这无论如何不能工作,因为''0xe2 '!='\ xe2''。 – yak

回答

3

您使用codecs.open让你的文件对象预计unicode字符串,而不是字节字符串。

使用此函数的要点是,在将它们写入文件之前,您不必自己编码字符串。您编写unicode字符串,文件对象将在内部编码它们。

它看起来像smart_str返回UTF-8编码的字符串(看到您将编码名称传递给它)。如果你将它传递给需要编解码器的文件对象,它需要unicode,它将首先尝试将字节串解码回unicode。因为它不知道传入的字符串的编码,它将使用ascii。而这也正是这个错误来自因为字符串不是ASCII,这是UTF-8:

UnicodeDecodeError : 'ascii' codec can't decode... 

所以,你要跳过编码阶段由smart_str做,简单的写unicode字符串的文件,或者,从codecs.open()切换到正常的open()它与字节一起工作,并且因此期望已经编码的字节字符串。

顺便说一句,您对0xE2字符存在的测试将无法正常工作。首先,您使用r'0xe2'作为模式,它只是一个4个字符的字符串,而不是一个单一的0xE2字符。其次,你不需要re这样简单的事情。刚刚尝试这一点:

print '\xe2' in your_str 
+0

问题是如何解决有关字符'0xe2'的UnicodeDecodeError,当我尝试将文本“行”写入文件时出现。 –

+0

我的意思是这个字符当然不存在于文本中。这种错误是如何发生的,我应该怎么做呢? –

+0

我需要smart_str,因为我在写入文件之前在字符串上执行搜索,这里没有显示。在搜索后,我得到这些错误,我无法将字符串写入任何文件,既不打开简单打开也不打开与codecs.open(...)。 –

相关问题