具体地说,我们试图将字符串转换为Unicode,并且我们收到了UnicodeDecodeError错误。
例如:
>>> unicode('\xab')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 0: ordinal not in range(128)
当然,这是没有任何问题的。
>>> unicode(u'\xab')
u'\xab'
当然,这段代码是为了演示转换问题。在我们的实际代码中,我们不使用字符串字面量,也不能仅仅添加unicode 'u'前缀,而是要处理从os.walk()返回的字符串,并且文件名包含上述值。由于我们无法将该值强制转换为Unicode,因此不确定该如何继续进行。
一种非常可怕的hack方法是编写自己的str2uni()方法,类似于:
def str2uni(val):
r"""brute force coersion of str -> unicode"""
try:
return unicode(src)
except UnicodeDecodeError:
pass
res = u''
for ch in val:
res += unichr(ord(ch))
return res
但在此之前,我们想知道是否有其他人有任何见解?
更新
我看到大家都集中在我是如何得出我发布的示例上,而不是结果。唉——好吧,这里是导致我花费数小时将问题简化为我上面分享的最简形式的代码。
for _,_,files in os.walk('/path/to/folder'):
for fname in files:
filename = unicode(fname)
当文件名的值为“3\xab Floppy (A).link”时,该代码段会抛出UnicodeDecodeError异常。
要查看错误,请执行以下操作:
>>> unicode('3\xab Floppy (A).link')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 1: ordinal not in range(128)
更新
我非常感谢大家的帮助。我也很感激大多数人在字符串/Unicode处理方面犯了一些简单的错误。但我想强调一下对UnicodeDecodeError异常的引用。我们在调用unicode()构造函数时遇到了这个异常!
我认为根本原因在于上述维基文章中描述的内容http://wiki.python.org/moin/UnicodeDecodeError。请从第二段开始阅读,关于"具有讽刺意味的是,在编码时可能会发生UnicodeDecodeError..."。维基文章非常准确地描述了我们所经历的问题——虽然它详细阐述了原因,但没有提出解决方法。
事实上,第三段以以下令人震惊的承认开始:"与UnicodeEncodeError类似的情况不同的是,这种失败并不能总是避免..."。
由于作为开发者,我不习惯于“无法找到解决方法”的信息,因此我想在Stack Overflow上寻求他人的经验。
\xab
吗? - Paulo Buos.walk()
的?我认为你混淆了 Unicode 和 UTF-8(以及其他编码)... - Tim Pietzcker