我有一组来自旧版 MAC 操作系统文件存储的文件。我知道该集合存在文件名/路径名问题。该问题源于在路径中包含一个代码点,我认为该代码点在原始操作系统中呈现为破折号,但 Windows 与代码点作斗争,并且包含 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?)编码字符串,并带有代码点替换,这意味着当它测试存在时
或 isfile
测试是否存在错误的文件名,因为带有替换的 ?
的文件不存在。
如何安全地处理这些文件?我收集了约 700 个文件,其中约有 40 个。
最佳答案
尝试将 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
,但不能返回纯粹的字节。
如果有人能解释这个谜团,我将不胜感激。
关于python `os` 返回 `os` 认为不存在的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23419415/