用unicode文件名打开文件?

时间:2012-04-16 19:58:35

标签: python file unicode

我似乎无法打开具有unicode文件名的文件。让我们说:

for i in os.listdir():
    open(i, 'r')

当我尝试搜索某些解决方案时,我总是会获得有关如何读取和写入unicode字符串到文件的页面,而不是如何打开包含file()open()的文件的页面。 unicode名称。

2 个答案:

答案 0 :(得分:27)

只需为open()传递一个unicode字符串作为文件名:

在Python 2.x中:

>>> open(u'someUnicodeFilenameλ')
<open file u'someUnicodeFilename\u03bb', mode 'r' at 0x7f1b97e70780>

在Python 3.x中,所有字符串都是Unicode,因此几乎没有任何字符串。

与往常一样,请注意,打开文件的最佳方式始终是将with statementopen()结合使用。

编辑:关于os.listdir(),建议再次变化,在Python 2.x下,你必须要小心:

  

os.listdir(),它返回文件名,引发了一个问题:它应该返回Unicode版本的文件名,还是应该返回包含编码版本的8位字符串? os.listdir()将执行这两个操作,具体取决于您是将目录路径提供为8位字符串还是Unicode字符串。如果传递Unicode字符串作为路径,则将使用文件系统的编码对文件名进行解码,并返回Unicode字符串列表,而传递8位路径将返回文件名的8位版本。

Source

简而言之,如果您想要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")
相关问题