4

我已经阅读了很多关于这个主题的内容,包括似乎是关于这个主题的权威指南: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 = unicode(os.path.join(unicode(root), unicode(filename)))

但是我尝试过的任何事情都没有奏效。

这是我的两个问题:

  1. 如何让它将正确的文件名传递给 os.stat() 方法,以便我可以从中获得正确的响应?

  2. 我的脚本需要将一些文件名写入文本文件,以后可能要从中读取。此时,它需要能够根据刚刚从文本文件中读取的内容找到文件。如何将此类文件名正确写入文本文件,然后再正确读取?

4

2 回答 2

2

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

dirpath = raw_input()

改为:

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

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

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

于 2012-07-18T18:53:07.100 回答
2

传递unicode路径到os.walk().

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

资源

于 2012-07-18T16:05:15.557 回答