Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中处理UTF文件名_Python_Windows_Filenames_Utf - Fatal编程技术网

在Python中处理UTF文件名

在Python中处理UTF文件名,python,windows,filenames,utf,Python,Windows,Filenames,Utf,我已经读了很多关于这个话题的书,包括这里关于这个话题的权威指南: 也许对于一个更有经验的开发人员来说,这个指南就足够了。然而,在我的情况下,我比刚开始的时候更加困惑,仍然没有解决我的问题 我试图使用os.walk()读取文件名,并在将这些信息写入文本文件之前获取有关文件的某些信息(如文件大小)。只要我没有遇到任何文件名用utf编码的文件,这就行了。当它命中一个utf编码名称的文件时,我会得到如下错误: WindowsError: [Error 123] The filename, directo

我已经读了很多关于这个话题的书,包括这里关于这个话题的权威指南:

也许对于一个更有经验的开发人员来说,这个指南就足够了。然而,在我的情况下,我比刚开始的时候更加困惑,仍然没有解决我的问题

我试图使用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)))
但我试过的都不管用

以下是我的两个问题:

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

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


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

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


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

    dirpath = raw_input()
    
    更改为:

    dirpath = raw_input().decode(sys.stdin.encoding)
    
    这允许传递给os.walk()的参数采用unicode格式,从而使其返回的文件名也采用unicode格式


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

    +1这是一个痛苦的问题-您无法通过便携或正确的方式完成此操作,但您可以进行一些假设,并从中获得大部分信息。(例如,假设linux上的语言环境是正确的,或者windows上的文件系统采用了可以存储所需字符的正确编码,等等)。您似乎在使用windows,如果您将问题缩小到仅限windows,则准确、正确的答案应该是可行的。感谢您对我的两个问题中的一个做出模糊但最终有用的回答。哈,哇。另一个问题的答案当然是,
    codecs.open()