Python 2.7:
mp3 を開いて、mutagen を使用して 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"
正常に動作します。
2つの違いは何ですか?一方が機能し、もう一方が機能しないのはなぜですか?
乾杯、
フェリックス
編集: 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")
しかし、私はまだ問題の原因を理解していません.これはおそらく他の危険なファイル名では機能しないハックな修正です...