Обрабатывает имена файлов Posix не-UTF-8, используя Python pathlib?
Я пытаюсь использовать модуль pathlib, который стал частью стандартной библиотеки в Python 3.4+, для поиска и управления путями к файлам. Хотя это улучшение по сравнению с функциями стиля 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 такие файлы могут существовать, и я хотел бы иметь возможность обрабатывать любые допустимые имена файловых систем в моем приложении, а не вызывать ошибки и / или предсказуемое поведение.
Я могу получить объект PosixPath для таких файлов внутри каталога, используя метод.iterdir() родительского каталога. Но мне еще предстоит найти способ получить его по полному пути, который был указан как переменная типа "байты", чего довольно сложно избежать при загрузке путей из другого источника, который полностью поддерживает все допустимые значения файловых систем для необработанных байтов (такой как база данных или файл, содержащий пути, разделенные нулями).
Есть ли способ сделать это, о котором я не знаю? Или, если это на самом деле невозможно: это задумано, или это может считаться недостатком стандартной библиотеки, которая может требовать сообщения об ошибке?
Я нашел сообщение об ошибке, но эта проблема касалась документации, в которой ошибочно указывалось, что аргументы класса 'байты' разрешены.
1 ответ
Я думаю, что вы можете получить то, что вы хотите, как это:
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']