12

我似乎无法打开具有 unicode 文件名的文件。假设我这样做:

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

当我尝试寻找一些解决方案时,我总是得到关于如何读取和写入文件的 unicode 字符串的页面,而不是如何打开具有 unicode 名称file()open()具有 unicode 名称的文件。

4

2 回答 2

28

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

在 Python 2.x 中:

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

在 Python 3.x 中,所有字符串都是 Unicode,所以它实际上没有任何意义。

与往常一样,请注意,打开文件的最佳方式始终是将with语句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。

于 2012-04-16T20:00:57.220 回答
8

你可以试试这个:

import os
import sys

for filename in os.listdir(u"/your-direcory-path/"):
  open(filename.encode(sys.getfilesystemencoding()), "r")
于 2012-04-16T20:10:32.303 回答