我似乎无法打开具有unicode文件名的文件。让我们说:
for i in os.listdir():
open(i, 'r')
当我尝试搜索某些解决方案时,我总是会获得有关如何读取和写入unicode字符串到文件的页面,而不是如何打开包含file()
或open()
的文件的页面。 unicode名称。
答案 0 :(得分:27)
只需为open()
传递一个unicode字符串作为文件名:
在Python 2.x中:
>>> open(u'someUnicodeFilenameλ')
<open file u'someUnicodeFilename\u03bb', mode 'r' at 0x7f1b97e70780>
在Python 3.x中,所有字符串都是Unicode,因此几乎没有任何字符串。
与往常一样,请注意,打开文件的最佳方式始终是将with
statement与open()
结合使用。
编辑:关于os.listdir()
,建议再次变化,在Python 2.x下,你必须要小心:
os.listdir(),它返回文件名,引发了一个问题:它应该返回Unicode版本的文件名,还是应该返回包含编码版本的8位字符串? os.listdir()将执行这两个操作,具体取决于您是将目录路径提供为8位字符串还是Unicode字符串。如果传递Unicode字符串作为路径,则将使用文件系统的编码对文件名进行解码,并返回Unicode字符串列表,而传递8位路径将返回文件名的8位版本。
简而言之,如果您想要Unicode输出,请将Unicode放入:
>>> os.listdir(".")
['someUnicodeFilename\xce\xbb', 'old', 'Dropbox', 'gdrb']
>>> os.listdir(u".")
[u'someUnicodeFilename\u03bb', u'old', u'Dropbox', u'gdrb']
请注意,该文件仍会以任何方式打开 - 它不会在Python中很好地表示,因为它将是一个8位字符串,但它仍然有用。
open('someUnicodeFilename\xce\xbb')
<open file 'someUnicodeFilenameλ', mode 'r' at 0x7f1b97e70660>
在3.x之下,一如既往,它始终是Unicode。
答案 1 :(得分:8)
你可以试试这个:
import os
import sys
for filename in os.listdir(u"/your-direcory-path/"):
open(filename.encode(sys.getfilesystemencoding()), "r")