python `os` 返回 `os` 认为不存在的文件

标签 python operating-system codepoint

我有一组来自旧版 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 列表,而不是 strs。


不幸的是,我想得越多,就越不明白为什么这样做会起作用。每个文件系统最终都使用某种编码以字节为单位存储其文件名。 HDF+ for instance以 UTF-16 格式存储文件名。因此,如果 os.listdir 能够最轻松地返回这些原始字节而不掺假,那就有意义了。但相反,在这种情况下, os.listdir 看起来可以返回纯粹的 unicode,但不能返回纯粹的字节。

如果有人能解释这个谜团,我将不胜感激。

关于python `os` 返回 `os` 认为不存在的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23419415/

相关文章:

python - 如何使用 Homebrew 在 Mac 上同时安装 Python 2 和 3?

linux - 既然所有的用户线程都映射到内核线程,那么用户线程是不是运行在内核态呢?

linux - 更多线程意味着更多上下文切换? Linux 内核也是如此吗?

unicode - 代理对是表示 UTF-16 中大于 2 个字节的代码点的唯一方法吗?

java - 获取字符代码点的正确方法是什么?

在 C 中将代码点转换为 wchar_t

python - gensim中filter_extreme的使用误区

python - 从具有坐标和值的字典构建 numpy 矩阵

Python - 交换行和列,同时用它创建字典

临界区概率 while 循环