gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:13:34 26 4
gpt4 key购买 nike

我正在尝试使用成为 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 对象。但是我还没有找到一种方法来从作为“字节”类型变量提供的完整路径获取它,这在从另一个完全支持所有文件系统有效原始字节值的来源加载路径时很难避免(例如数据库或包含以 nul 分隔的路径的文件)。

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

我确实找到了 related bug report ,但该问题涉及文档错误地提到允许类“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']

关于python - 使用 Python pathlib 处理非 UTF-8 Posix 文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com