我已经阅读了相当多的话题,包括什么似乎是这方面的权威指南: 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)))
但没有任何我曾经尝试过的工作。
这是我的两个问题:
我怎么能得到它传递正确的文件名到os.stat()方法,以便我可以从它得到一个正确的响应?
我的脚本需要将一些文件名写入文本文件,以后可能要读取。 在这一点上,它需要能够根据刚刚从文本文件中读取的内容来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()功能