蟒蛇 2.7:
我正在尝试打开一个 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")
但我仍然不明白是什么导致了问题,这是一个 hacky 修复,可能不适用于其他狡猾的文件名......