Python无法打开路径

|中的文件 我有一个具有以下路径的文件:D:/ bar / kuレイジー・ヒッツ!/foo.abc 我正在解析XML文件中的路径,并将其以
file://localhost/D:/bar/クレイジー・ヒッツ!/foo.abc
的形式存储在名为
path
的变量中 然后,正在执行以下操作:
path=path.strip()
path=path[17:] #to remove the file://localhost/  part
path=urllib.url2pathname(path)
path=urllib.unquote(path)
错误是:
IOError: [Errno 2] No such file or directory: \'D:\\\\bar\\\\\\xe3\\x82\\xaf\\xe3\\x83\\xac\\xe3\\x82\\xa4\\xe3\\x82\\xb8\\xe3\\x83\\xbc\\xe3\\x83\\xbb\\xe3\\x83\\x92\\xe3\\x83\\x83\\xe3\\x83\\x84\\xef\\xbc\\x81\\\\foo.abc\'
更新1:我在Windows 7上使用Python 2.7     
已邀请:
您的错误路径是:
\'\\xe3\\x82\\xaf\\xe3\\x83\\xac\\xe3\\x82\\xa4\\xe3\\x82\\xb8\\xe3\\x83\\xbc\\xe3\\x83\\xbb\\xe3\\x83\\x92\\xe3\\x83\\x83\\xe3\\x83\\x84\\xef\\xbc\\x81\'
我认为这是文件名的UTF8编码版本。 我已经在Windows7上创建了一个同名文件夹,并在其中放置了一个名为\'abc.txt \'的文件:
>>> a = \'\\xe3\\x82\\xaf\\xe3\\x83\\xac\\xe3\\x82\\xa4\\xe3\\x82\\xb8\\xe3\\x83\\xbc\\xe3\\x83\\xbb\\xe3\\x83\\x92\\xe3\\x83\\x83\\xe3\\x83\\x84\\xef\\xbc\\x81\'
>>> os.listdir(\'.\')
[\'?????\\xb7???!\']
>>> os.listdir(u\'.\') # Pass unicode to have unicode returned to you
[u\'\\u30af\\u30ec\\u30a4\\u30b8\\u30fc\\u30fb\\u30d2\\u30c3\\u30c4\\uff01\']
>>> 
>>> a.decode(\'utf8\') # UTF8 decoding your string matches the listdir output
u\'\\u30af\\u30ec\\u30a4\\u30b8\\u30fc\\u30fb\\u30d2\\u30c3\\u30c4\\uff01\'
>>> os.listdir(a.decode(\'utf8\'))
[u\'abc.txt\']
因此,邓肯的建议“ѭ6”似乎可以解决问题。 更新资料 我无法为您测试此情况,但建议您在执行“ 7”之前尝试检查路径是否包含非ascii。这有点hacky ...
ASCII_TRANS = \'_\'*32 + \'\'.join([chr(x) for x in range(32,126)]) + \'_\'*130
path=path.strip()
path=path[17:] #to remove the file://localhost/  part
path=urllib.unquote(path)
if path.translate(ASCII_TRANS) != path: # Contains non-ascii
  path = path.decode(\'utf8\')
path=urllib.url2pathname(path)
    
将文件名作为“ 9”字符串提供给“ 10”调用。 您如何产生文件名? 如果由您提供为常量 在脚本开头附近添加一行:
# -*- coding: utf8 -*-
然后,在支持UTF-8的编辑器中,将ѭ0设置为
unicode
文件名:
path = u\"D:/bar/クレイジー・ヒッツ!/foo.abc\"
从目录内容列表中读取 使用
unicode
dirspec检索目录的内容:
dir_files= os.listdir(u\'.\')
从文本文件读取 使用
codecs.open
打开包含文件名的文件以从中读取
unicode
数据。您需要指定文件的编码(因为您知道计算机上非Unicode应用程序的“默认Windows字符集”是什么)。 在任何情况下 做一个:
path= path.decode(\"utf8\")
在打开文件之前;如果不是\“ utf8 \”,请替换正确的编码。     
这是文档中一些有趣的内容:   sys.getfilesystemencoding()      返回使用的编码名称   将Unicode文件名转换为   系统文件名;如果   使用系统默认编码。的   结果值取决于操作   系统:在Mac OS X上,编码为   \'utf-8 \'。在Unix上,编码为   用户的偏好根据   nl_langinfo(CODESET)的结果,或   如果nl_langinfo(CODESET)无   失败了在Windows NT +上,文件名是   Unicode本机,因此不进行转换   执行。 getfilesystemencoding()   仍然返回\'mbcs \',因为这是   应用程序应使用的编码   当他们明确想要转换时   Unicode字符串到字节字符串   用作文件时等效   名称。在Windows 9x上,编码为   \'mbcs \'。      2.3版的新功能。 如果我理解正确,则应将文件名作为unicode传递:
f = open(unicode(path, encoding))
    

要回复问题请先登录注册