我正在使用python 2.6 for Windows。
我使用os.walk读取文件树。文件的文件名中可能包含非7位字符(例如德语“ae”)。它们以Pythons内部字符串表示形式编码。
我正在使用Python库函数处理这些文件名,但由于编码错误而失败。
如何将这些文件名转换为正确的(unicode?)python字符串?
我有一个文件“d:\ utest \ü.txt”。将路径作为unicode传递不起作用:
>>> list(os.walk('d:\\utest'))
[('d:\\utest', [], ['\xfc.txt'])]
>>> list(os.walk(u'd:\\utest'))
[(u'd:\\utest', [], [u'\xfc.txt'])]
答案 0 :(得分:45)
如果将Unicode字符串传递给os.walk()
,您将获得Unicode结果:
>>> list(os.walk(r'C:\example')) # Passing an ASCII string
[('C:\\example', [], ['file.txt'])]
>>>
>>> list(os.walk(ur'C:\example')) # Passing a Unicode string
[(u'C:\\example', [], [u'file.txt'])]
答案 1 :(得分:6)
我一直在寻找Python 3.0+的解决方案。如果其他人需要它,就会把它放在这里。
rootdir = r'D:\COUNTRY\ROADS\'
fs_enc = sys.getfilesystemencoding()
for (root, dirname, filename) in os.walk(rootdir.encode(fs_enc)):
# do your stuff here, but remember that now
# root, dirname, filename are represented as bytearrays
答案 2 :(得分:3)
os.walk(unicode(root_dir, 'utf-8'))
答案 3 :(得分:2)
更直接的方法可能是尝试以下方法 - 找到您的文件系统的编码,然后将其转换为unicode。例如,
unicode_name = unicode(filename, "utf-8", errors="ignore")
走另一条路,
unicode_name.encode("utf-8")
答案 4 :(得分:1)
os.walk
未指定始终使用os.listdir
,但也未列出如何处理Unicode。但是,os.listdir
确实说:
在2.3版中更改:在Windows上 NT / 2k / XP和Unix,如果路径是a Unicode对象,结果将是一个 Unicode对象列表。无法解码 文件名仍将作为返回 字符串对象。
简单地使用Unicode参数是否适合您?
for dirpath, dirnames, filenames in os.walk(u"."):
print dirpath
for fn in filenames:
print " ", fn
答案 5 :(得分:1)
不,它们不是用Pythons内部字符串表示编码的,没有这样的东西。它们以操作系统/文件系统的编码进行编码。虽然通过os.walk传递unicode。
我不知道当文件名无法解码时os.walk的行为如何,但我认为你会得到一个字符串,就像os.listdir()一样。在那种情况下,你以后会再次遇到问题。此外,并非所有Python 2.x标准库都能正确接受unicode参数,因此您可能需要将它们编码为字符串。所以,问题实际上可能在其他地方,但你会注意到是否是这种情况。 ; - )
如果你需要更多的解码控制,你不能总是传入一个字符串,然后只需解码它 filename = filename.decode() 像往常一样。