【问题标题】:python3.5 open file with latin1 character on namepython3.5打开名称上带有latin1字符的文件
【发布时间】:2016-08-31 17:33:21
【问题描述】:

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

>>> 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'

【问题讨论】:

    标签: python-3.x directory pathlib


    【解决方案1】:

    不幸的是,您似乎必须将 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') 将字节对象转换回字符串

    【讨论】:

    • 那么,有没有办法让我获取列表 a = ["não", "ã"] 并自动将代码点传递到列表中,所以结果将是 a = [ "n\u00e3o", "\u00e3"]?
    • 可以尝试在循环中使用str.replace('a', '\u00e3') 方法。
    • 我认为它不起作用,如果我在列表中有一个像“and”这样的词,它会变成“\u00e3nd”:(我试图弄清楚如何处理它,任何单词。
    • 编辑了我的答案以显示如何以字节形式获取文件名列表。这有帮助吗?然后,您可以对获得的每个文件名执行 filename.decode('latin-1')
    • 问题是,如果你只是在你的源代码中输入'ã',python会将它改为'a'。您可以通过将# -*- coding: latin-1 -*- 放在源文件顶部来解决此问题。
    猜你喜欢
    • 1970-01-01
    • 2018-02-12
    • 2013-01-12
    • 2018-10-23
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多