使用Python pathlib处理非UTF-8 Posix文件名?

时间:2017-08-16 23:05:33

标签: python python-3.x utf-8 posix 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文件系统上,这样的文件可以存在,我希望能够在我的应用程序中处理任何文件系统有效的文件名,而不是导致错误和/或可预测的行为。

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

有没有办法做到这一点,我不知道?或者,如果它真的不可能:这是设计,还是可能被认为是标准库中可能需要错误报告的缺陷?

我确实找到了related bug report,但该问题涉及到错误地提及类&#39;字节&#39;的参数的文档。被允许。

1 个答案:

答案 0 :(得分:2)

我认为你可以得到你想要的东西:

# iptables-save > iptables.bak && iptables -F

演示:

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