在Python中处理UTF文件名

我已经阅读了相当多的话题,包括什么似乎是这方面的权威指南: http : //docs.python.org/howto/unicode.html

也许对于一个更有经验的开发者来说,那个指南可能就够了 但是,就我而言,我比起初我更困惑,仍然没有解决我的问题。

我正在尝试使用os.walk()读取文件名,并在将该信息写入文本文件之前获取有关这些文件的某些信息(如文件大小)。 这个工作,只要我没有遇到任何与utf编码的文件名的文件。 当它用utf编码的名字命中一个文件时,我得到这样一个错误:

WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect: 'Documents\\??.txt' 

在这种情况下,该文件被命名为唽咿.txt。

以下是我迄今为止一直试图做的事情:

 for (root, dirs, files) in os.walk(dirpath): for filename in files: filepath = os.path.join(root, filename) filesize = os.stat(filepath).st_size file = open(filepath, 'rb') stuff = get_stuff(filesize, file) file.close() 

在这种情况下,dirpath来自代码的较早部分,这相当于'dirpath = raw_input()'。

我已经尝试了各种东西,如更改filepath行到:

 filepath = unicode(os.path.join(unicode(root), unicode(filename))) 

但没有任何我曾经尝试过的工作。

这是我的两个问题:

  1. 我怎么能得到它传递正确的文件名到os.stat()方法,以便我可以从它得到一个正确的响应?

  2. 我的脚本需要将一些文件名写入文本文件,以后可能要读取。 在这一点上,它需要能够根据刚刚从文本文件中读取的内容来find文件。 如何正确地将这样的文件名写入文本文件,然后再正确读取?

将一个unicode路径传递给os.walk()

在版本2.3中更改:在Windows NT / 2k / XP和Unix上,如果path是一个Unicode对象,则结果将是一个Unicode对象列表。

资源

对于那些有兴趣的完整解决方案:

 dirpath = raw_input() 

被改为:

 dirpath = raw_input().decode(sys.stdin.encoding) 

这允许传递给os.walk()的参数是unicode,导致返回的文件名也是unicode。

要写这些文件或从文件(我的第二个问题),我用codecs.open()功能