我有来自较旧的MAC OS文件存储的文件集合。我知道集合中存在文件名/路径名问题。问题源于在我认为在原始操作系统中呈现为破折号的路径中包含代码点,但是窗口与代码点挣扎,并且在前一个字符中包含diacritic,或者将其替换为一个?
我试图想办法建立一个真理"文件结构,所以我可以肯定我会计算每个文件。
我用一些工具探索过文件,没有任何匹配的标签。我相信以下内容证明了这个问题。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
folder = "emails"
b = os.listdir(folder)
for f in b:
print repr(f)
print os.path.isfile(os.path.join(folder, f))
(我必须编辑实际的文件名)
结果: -
'file(1)'
True
'file(2)'
True
'file(3)?'
False
'file(4)'
True
感兴趣的文件名是file(3)?
,其中奇数码点已被解码为?
,并且评估为不是文件(或甚至通过os.path.exists
存在)。
请注意,print repr(string)
表示其处理UTF-8,正确编码?
。
我可以复制粘贴文件夹中的文件名,它显示为:file(3)
注意完整停止。
我可以将字符串粘贴到我的编辑器(subl)中,看看我现在有一个不可显示的最终代码点的代码点字形
a = "file(3)"
print a
print repr(a)
给我:
file(3)
'file(3)\xef\x80\xa9'
从中可以看出,奇数代码点是\xef\x80\xa9
。在集合的其他地方,我也找到了代码点\xef\x80\xa8
。
我必须假设os.listdir
没有返回原始代码点值而是返回一个(UTF-8?)编码字符串,其代码点替换意味着它在测试exists
或isfile
时它测试是否存在错误的文件名,因为带有替代?
的文件不存在。
如何安全地使用这些文件?我有大约40个大约700个文件的集合。
答案 0 :(得分:1)
尝试将unicode
传递给os.listdir
:
folder = u"emails"
b = os.listdir(folder)
这样做会导致os.listdir
返回一个unicode列表而不是str
s。
不幸的是,我越是想到这一点,我就越不了解为什么会这样。每个文件系统最终使用某种编码以字节为单位存储其文件名。 HDF+ for instance以UTF-16存储文件名。因此,如果os.listdir
可以在没有掺假的情况下最容易地返回那些原始字节,那将是有意义的。但相反,在这种情况下,看起来os.listdir
可以返回未掺杂的unicode
,但不能返回未掺杂的字节。
如果有人能解释这个谜,我会非常感激。
答案 1 :(得分:1)
这些文件是来自Mac Roman编码(可能是MacOS使用的),还是Mac OS X使用的NFKD普通形式的UTF-8?
Unicode正常形式的概念是每个程序员应该熟悉的概念......尽管很少见。我不能告诉你关于Python你需要知道什么。