如何在Python中处理不可解码的文件名?

adr*_*ian 9 python unicode filenames path character-encoding

我真的希望我的Python应用程序在内部专门处理Unicode字符串.这对我来说最近很顺利,但我遇到了处理路径的问题.用于文件系统的POSIX API不是Unicode,因此文件可能(实际上有点常见)具有"不可解码"名称:文件系统未声明的文件名称.

在Python中,这表现为返回的对象unicodestr对象的混合os.listdir().

>>> os.listdir(u'/path/to/foo')
[u'bar', 'b\xe1z']
Run Code Online (Sandbox Code Playgroud)

在该示例中,字符'\xe1'以Latin-1或某些形式编码,即使(假设的)文件系统报告sys.getfilesystemencoding() == 'UTF-8'(在UTF-8中,该字符将是两个字节'\xc3\xa1').出于这个原因,UnicodeError如果您尝试使用os.path.join()Unicode路径,那么您将遍布整个地方,因为文件名无法解码.

Python的Unicode指南提供有关Unicode路径名这样的建议:

请注意,在大多数情况下,应使用Unicode API.字节API只应用于可以存在不可解码文件名的系统,即Unix系统.

因为我主要关心Unix系统,这是否意味着我应该重构我的程序以仅处理路径的字节串?(如果是这样,我如何保持Windows兼容性?)或者还有其他更好的方法来处理不可解码的文件名吗?它们是否"非常稀有",我应该让用户重命名他们该死的文件?

(如果最好只在内部处理字节串,我有一个后续问题:如何在SQLite中为一列存储字节串,同时将其余数据保存为友好的Unicode字符串?)

Mar*_*nen 5

如果您愿意切换到Python 3.1或更高版本,Python确实可以解决该问题:

PEP 383-系统字符接口中的不可解码字节