使用 Python 路径库处理非 UTF-8 Posix 文件名?

Processing non-UTF-8 Posix filenames using Python pathlib?

我正在尝试使用成为 Python 3.4+ 标准库一部分的 pathlib 模块来查找和操作文件路径。虽然它是对 os.path 样式函数的改进,能够以面向对象的方式处理路径,但我在处理 Posix 文件系统上的一些更奇特的文件名时遇到了麻烦;特别是名称包含无法解码为 UTF-8 的字节的文件:

>>> pathlib.PosixPath(b'\xe9')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/pathlib.py", line 969, in __new__
    self = cls._from_parts(args, init=False)
  File "/usr/lib/python3.5/pathlib.py", line 651, in _from_parts
    drv, root, parts = self._parse_args(args)
  File "/usr/lib/python3.5/pathlib.py", line 643, in _parse_args
    % type(a))
TypeError: argument should be a path or str object, not <class 'bytes'>

>>> b'\xe9'.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 0: unexpected end of data

这个问题是在 Posix 文件系统上,这样的文件 可以 存在,我希望能够处理任何文件系统有效的文件名在我的应用程序中而不是导致错误 and/or 不可预测的行为。

我可以使用父目录的 .iterdir() 方法为目录中的此类文件获取 PosixPath 对象。但是我还没有找到一种方法来从作为 'bytes' 类型变量提供的完整路径获取它,这在从另一个完全支持所有文件系统有效原始字节的源加载路径时很难避免值(例如包含 nul 分隔路径的数据库或文件)。

有没有我不知道的方法可以做到这一点?或者,如果真的不可能:这是设计使然,还是可以将其视为标准库中的缺陷,可能需要提交错误报告?

我确实找到了一个 related bug report,但该问题涉及的文档错误地提到 class 'bytes' 的参数是允许的。

我想你可以这样得到你想要的:

import os
PosixPath(os.fsdecode(b'\xe9'))

演示:

>>> import os, pathlib
>>> b = b'\xe9'
>>> p = pathlib.Path(os.fsdecode(b))
>>> p.exists()
False
>>> with open(b, mode='w') as f:
...     f.write('wacky filename')
...     
>>> p.exists()
True
>>> p.read_bytes()
b'wacky filename'
>>> os.listdir(b'.')
[b'\xe9']