1

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")

しかし、私はまだ問題の原因を理解していません.これはおそらく他の危険なファイル名では機能しないハックな修正です...

4

2 に答える 2

1

ディレクトリで os.listdir() を使用して、エンコードされたファイル名を確認します。次に、それを filename.encode('cp1252') を実行したときに得られるものと比較します。違いがあるはずであり、何が間違っているかがわかります。

私が考えることができる唯一の実際の問題は、何かが 2 回デコードされることです。正規化の問題も発生する可能性がありますが、この場合はほとんどありません。

于 2011-01-12T18:04:52.293 に答える
1

推測ですが、現在のデフォルト エンコーディング (Windows の英語版では cp1252) でマルチバイト文字セットを使用しているプログラムからファイル名を取得しています。Ascii には拡張文字が含まれていないため、Ascii エンコーディングを使用して文字列を Unicode にエンコードしようとするとエラーが発生します。

編集:この回答には、現在の Windows コード ページでのファイル名のエンコードに関する情報が含まれています。

于 2011-01-17T01:31:08.357 に答える