2011-01-12 22 views
1

的Python 2.7:使用python 2.7,为什么我的unicode文件名在调用file()时引发IOError?

我试图打开一个MP3使用诱变剂的ID3标签读取(所以我宁愿没有改变的方法),该方法调用:

file(filename, "rb") 

对于文件无特殊字符能正常工作,但除此之外,我有时似乎得到

IOError: [Errno 2] No such file or directory: u"somepath\\08 - Muse - I Belong To You - Mon C\x9cur S'ouvre \xc0 Ta Voix.mp3" 

而其他时候

u"somepath\\02 - Max\xefmo Park - Apply Some Pressure.mp3" 

工作正常。

两者有什么区别?为什么一个人工作,而另一个不工作?

干杯,

菲利克斯

编辑:在Eclipse下的PyDev运行时,对于其

sys.getdefaultencoding() 

退换 “的Cp1252”,而不是从返回 “ASCII” 命令行它的工作。当打印到Eclipse控制台的文件名是

u"somepath\\08 - Muse - I Belong To You - Mon C\u0153ur S'ouvre \xc0 Ta Voix.mp3" 

编辑:后者从Winamp的(音乐播放器)文件名中的代码是:

winampProcess = win32api.OpenProcess(win32con.PROCESS_VM_READ, False, processID) 
memoryBuffer = ctypes.create_string_buffer(256) 
ctypes.windll.kernel32.ReadProcessMemory(winampProcess.handle, memoryPointer, memoryBuffer, 256, 0) 
winampProcess.Close() 
rawPath = win32api.GetFullPathName(memoryBuffer.raw.split("\x00")[0]) 
try: 
    unicodeString = unicode(rawPath) 
except UnicodeDecodeError: 
    unicodeString = u"" 
    for char in rawPath: 
     try: 
      unicodeString += unicode(char) 
     except UnicodeDecodeError as err: 
      errStr = str(err) 
      startIndex = errStr.index("0x") 
      endIndex = errStr.index(" ", startIndex) 
      hexStr = "" 
      for i in range(startIndex, endIndex): 
       hexStr += errStr[i] 
      unicodeString += unichr(int(hexStr, 16)) 
return unicodeString 

编辑:如果我明确设置的问题得到解决

unicode(str, "cp1252") 

,但我还是不明白是什么原因造成的问题,这是一个哈克修复,可能不会为其他狡猾的文件名工作...

+0

帮助我们来帮助你,给我们看一些代码;) – user225312 2011-01-12 17:02:51

+0

这是在Vista上,顺便说一句,但我需要我的代码是可移植的。 – erbridge 2011-01-12 17:03:48

+0

我不确定需要更多...? – erbridge 2011-01-12 17:05:39

回答

1

只是猜测 - 您正在使用当前默认编码中使用多字节字符集的程序拉取文件名,该编码是针对英文版Windows的cp1252。 Ascii不包括任何扩展字符,这就是为什么当您尝试使用Ascii编码将字符串编码为Unicode时出现错误的原因。

编辑:this answer有关于编码当前Windows代码页中的文件名的一些信息。

1

在目录上使用os.listdir()来查看文件名是什么,编码。然后将它与您在执行filename.encode('cp1252')时得到的结果进行比较。应该有所不同,这应该告诉你什么是错的。

我能想到的唯一真正的问题是某些东西会被解码两次。你也可能有规范化问题,但在这种情况下似乎不太可能。

相关问题