python3.5 打开名称上带有 latin1 字符的文件

python3.5 open file with latin1 character on name

我有一个名为 "não.mp3" 的文件,当我尝试使用 pathlib 打开它时,名称被转换为 "nao.mp3",因为文件夹中没有这样的文件,python returns一个错误:

>>> p = Path("D:/não.mp3")
>>> p
WindowsPath('D:/nao.mp3')
>>> p.exists()
False
>>> with p.open() as f: f.readline()
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\everton\AppData\Local\Programs\Python\Python35\lib\pathlib.py", line 1136, in open
    opener=self._opener)
  File "C:\Users\everton\AppData\Local\Programs\Python\Python35\lib\pathlib.py", line 992, in _opener
    return self._accessor.open(self, flags, mode)
  File "C:\Users\everton\AppData\Local\Programs\Python\Python35\lib\pathlib.py", line 371, in wrapped
    return strfunc(str(pathobj), *args)
FileNotFoundError: [Errno 2] No such file or directory: 'D:\nao.mp3'

不幸的是,您似乎必须将 Unicode 代码点作为字符串的一部分传递。 ã 的代码点是 '00E3' 试试这个:

p = Path("D:/n\u00e3o.mp3")

在 Windows 10 上执行此操作(并有相应的文件)时,我得到

>>> p.exists()
True

它看起来不像 pathlib 以您期望的方式处理 unicode 字符。您可以尝试另一个库,例如 osshutil.

os.listdir 可以为您提供目录中的所有文件名,如果您将目录名称作为字节 b'':

>>> os.listdir(b'D:/')
[b'n\xe3o.mp3']

使用它,您可以获得可用于构建路径的所有文件的列表。您可以使用 bytes_object.decode('latin-1')

将字节对象转换回字符串