【问题标题】:python character encoding pc macpython字符编码pc mac
【发布时间】:2017-10-10 22:00:47
【问题描述】:

诚然,我并不精通字符编码问题。 我编写了一个脚本,它使用 os.path.isfile() 在继续之前检查路径是否为文件。

在 Macos Python 2.7.10 上,我没有遇到任何问题,但我只是尝试在 Windows10 上第一次使用 Python 3.6.3 上的脚本,并遇到 isfile() 在绝对是文件的路径上返回 false ,并在 Macos 上被识别。

调查后,我发现在 Macos 上使用 os.listdir() 列出的违规文件与在 Windows10 上不同。它有一个特殊字符,以下是该特殊字符在两个操作系统上的再现方式:

PC: '\uf022' macOS:'\xef\x80\xa2'

我认为这与 os.path.isfile() 不喜欢文件的 Windows10 表示形式有关。为了测试这一点,我在 Windows10 上做了以下操作:

  • 将目录更改为文件所在目录,
  • 启动交互式 python shell
  • 导入操作系统
  • 执行 os.listdir()
  • 执行 os.path.isfile(文件名与 os.listdir 列出的完全相同)

这将返回 FALSE。 所以我很难过。任何帮助将不胜感激!


为了更加清晰,在 Windows10 Python 3.6.3 上进行以下编辑:

>>> files = os.listdir()
>>> files[5]
'1955 shark - Oz Huntly\uf022Noel.jpg'

>>> os.path.isfile( files[5] ) 
FALSE

>>> os.stat( files[5] )
FileNotFoundError: [WinError 2] The system cannot find the file specified: 
'1955 shark - Oz Huntly\uf022Noel.jpg'

最后一条线索表明这可能甚至与 Python 无关。我尝试通过资源管理器复制文件,但似乎操作系统本身无法找到它明确表示存在的文件,以及正常外观的文件大小和其他各种元数据。只有具有此特殊字符的两个文件使 Windows 变得混乱...鉴于这最终似乎并不是一个 Python 问题,请随意忽略/移动此问题...。

编辑 - 正如 Eryksun 在 cmets 中指出的那样:这可能是我用来允许 Windows10 读取 HFS+ 格式化驱动器的 Paragon HFS+ 驱动程序的错误。我把这个传给 Paragon。感谢您对 Eryksun 的帮助!

一切顺利, 马尔科姆

【问题讨论】:

  • 这是你的角色。有关如何键入它,请参阅 python 的东西。 charbase.com/f022-unicode-invalid-character
  • Python 2 默认为字节字符串,MacOS 文件系统编码为 UTF-8。 Python 3 使用 Unicode 字符串。名称是 "\uf022",而不是 "uf022"。这是一个 \u Unicode 转义,带有 Unicode 代码点 U+F022 的 4 位十六进制序数,它不是一个常规分配的字符。这是Private Use Area 中的一个代码点。
  • 感谢您的回复...抱歉,我忽略了在“\uf022”中包含反斜杠。我仍然很难过,因为如果我准确地将 os.listdir() 的输出提供给该文件,我希望 isfile() 返回 true?
  • isfile 统计文件,该文件可能会失败,在这种情况下,它会忽略错误并返回 false。试试os.stat(files[5])
  • 这取决于文件系统驱动程序。如果您没有使用由 Microsoft 编写并与 Windows 一起分发的驱动程序,那么您就不能真正对操作系统造成故障。例如,创建/打开操作使用IRP_MJ_CREATE I/O 请求调用驱动程序,文件名作为宽字符串(UTF-16LE,但允许单独的代理代码更宽松)传递。此请求可能会因映射到 WinAPI ERROR_FILE_NOT_FOUND (2) 的各种状态代码而失败,但通常是 STATUS_OBJECT_NAME_NOT_FOUND。可能驱动程序有一个错误,拒绝名称中的 U+F022 字符。

标签: python windows macos character-encoding


【解决方案1】:

我太新了,无法投票支持那些帮助阐明这一点的人。 Eryksun 在 cmets 中指出了一个可能的答案:这可能是我使用的 Paragon HFS+ 驱动程序的错误,它允许 Windows10 读取和写入 HFS+ 格式的驱动器。他比我更好地解释了他的想法,但基本上如果驱动程序代码在创建文件的打开请求时遇到非零状态,这可能会映射到 Windows 的“找不到文件”错误,因此会阻止对文件的访问确实存在并且有效。特殊字符 U+F022 可能会在文件打开过程中导致非零状态。 如果您觉得此答案有用,请在 cmets 中为 Eryksun 投票。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2021-08-27
    相关资源
    最近更新 更多