运行以下代码(只打印出文件名)时:
print filename
它会抛出以下错误:
File "myscript.py", line 78, in __listfilenames
print filename
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 13: ordinal not in range(128)
为了解决这个问题,我尝试将print filename
更改为print filename.encode('utf-8')
,但没有解决问题。
尝试读取Coé.jpg
等文件名时,仅脚本失败。
我是否可以修改filename
如何让脚本继续工作时会产生特殊字符?
NB。我是一个python noob
答案 0 :(得分:1)
filename
已经过编码。它已经是一个字节字符串,不需要再次编码。
但是既然你要求它被编码,那么Python首先必须解码它,并且它只能使用默认的ASCII编码。隐式解码失败了:
>>> 'Coé.jpg'
'Co\xc3\xa9.jpg'
>>> 'Coé.jpg'.decode('utf8')
u'Co\xe9.jpg'
>>> 'Coé.jpg'.decode('utf8').encode('utf8')
'Co\xc3\xa9.jpg'
>>> 'Coé.jpg'.encode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)
如果您想要编码的字节串,则根本不必进行任何编码。删除.encode('utf8')
。
您可能需要阅读Python和Unicode。我建议:
经验法则是:尽早解码,尽可能晚编码。这意味着当您接收数据时,解码为Unicode对象,当您需要将该信息传递给其他内容时,仅编码。许多API可以将解码和编码作为其工作的一部分;例如,print
将编码为终端使用的编解码器。