Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python unicode os.listdir()不从API返回结果_Python_Macos_Python 2.7_Unicode - Fatal编程技术网

Python unicode os.listdir()不从API返回结果

Python unicode os.listdir()不从API返回结果,python,macos,python-2.7,unicode,Python,Macos,Python 2.7,Unicode,我正在使用TMDb根据文件名查找媒体。大多数情况下,这都可以正常工作,除非我使用os.listdir()搜索名称中包含Unicode字符的文件,TMDb查找unicode格式的结果,并返回unicode格式的响应 以Amélie的封面艺术文件为例: Amélie.jpg 一个简单的受控实验表明,无论我尝试什么,它在使用类型化Unicode字符串时都有效,但在使用os.listdir()时无效 那么,为什么原始字符串(ASCII或Unicode)始终工作,而从文件系统中提取的文件名却不工作呢 我

我正在使用TMDb根据文件名查找媒体。大多数情况下,这都可以正常工作,除非我使用
os.listdir()
搜索名称中包含Unicode字符的文件,TMDb查找unicode格式的结果,并返回unicode格式的响应

Amélie
的封面艺术文件为例:

Amélie.jpg
一个简单的受控实验表明,无论我尝试什么,它在使用类型化Unicode字符串时都有效,但在使用
os.listdir()
时无效

那么,为什么原始字符串(ASCII或Unicode)始终工作,而从文件系统中提取的文件名却不工作呢

我试过:

  • 以各种组合进行编码(“utf-8”)和解码(“utf-8”)
  • 在所有文件加载中使用u“”前缀
  • 使用utf-8编码重新加载
    sys
  • 我看到Martijn Pieters的一篇帖子,内容是关于Mac OS对Unicode的处理方式不同,但我似乎再也找不到了
  • isinstance(文件,str)
    (令人惊讶的是,它不是unicode!)

所以。。。如何让文件夹枚举使用unicode字符,或者有没有合适的方法可以将这些ascii文件名转换为unicode,而不会出现可怕的
序号超出范围的错误?

不同之处在于您的文件系统使用的是分解的unicode字符。如果将返回的文件名规范化为组合的Unicode字符,则可以使用
\xe9
作为Unicode字符。
e\u0301
是ASCII
e
后跟组合重音:

>>> u'Am\xe9lie' == ud.normalize('NFC',u'Ame\u0301lie')
True
因此,请使用:

import unicodedata as ud
print('\nunicode listdir')
for filename in os.listdir(u'/media/artwork/'):
    nfilename = ud.normalize(filename)
    s = tmdb.Search()
    s.movie(query=os.path.splitext(nfilename)[0])
    print('Results', len(s.results))
    for r in s.results:
        print(r)

简化您的问题可能会更好,因为它似乎与TMDb没有任何关系。仅列出一个带有unicode字符的文件似乎就足够了。似乎是重复的?这是我从Martijn那里漏掉的问题。我去看看。Fwiw,不,更简单不会更好,因为我还不确定这是否与Unicode有关。可能是重复的,看起来这就是关键。在Windows或*nix上运行时有什么影响?这会失败吗?@brandonscript否,您可以规范化已经规范化的字符串,因此上述代码应该适用于任何操作系统。
>>> u'Am\xe9lie' == ud.normalize('NFC',u'Ame\u0301lie')
True
import unicodedata as ud
print('\nunicode listdir')
for filename in os.listdir(u'/media/artwork/'):
    nfilename = ud.normalize(filename)
    s = tmdb.Search()
    s.movie(query=os.path.splitext(nfilename)[0])
    print('Results', len(s.results))
    for r in s.results:
        print(r)