0

os.walkを使用してハードドライブからユーザーのファイルを読み取るPython2.7で記述されたアプリケーションがあります。

Unicode文字を含むファイル(たとえば、アーティスト名が含まれるオーディオファイル)を処理するため、アプリケーションにはUTF-8システムロケールが必要です(起動する前にenv変数を確認します)。これらのファイルをファイルシステムへの正しいファイル名。

一部のユーザーはUTF-8ロケール(したがってUTF-8 fs)を使用していますが、それでもどういうわけかISO-8859-1ファイルをドライブに保存できます。これにより、コードがこれらのディレクトリをos.walk()しようとすると、PythonがUTF-8を使用してISO-8859-1バイトのこのシーケンスをデコードしようとしたときに例外をスローするため、問題が発生します。

だから私の質問は、os.walk()全体を中止するのではなく、Pythonにこのファイルを無視して次のファイルに移動させるにはどうすればよいですか?自分のos.walk()関数をロールするだけでいいですか?

編集:これまで、ファイル名を修正するためにconvmv linuxコマンドを使用するようにユーザーに指示してきましたが、多くのユーザーはさまざまな種類のエンコーディング(8859-1、8859-2など)を使用しており、convmvを使用するにはユーザーが必要ですそれぞれに対してconvmvを個別に実行する前に、どのファイルがどのエンコーディングを使用しているかについて、知識に基づいて推測します。

4

2 に答える 2

3

Python Unicode ハウツーの一部であるUnicode filenamesをお読みください。最も重要なことは、ファイルシステムのエンコーディングは、ターミナルの現在の LANG 設定と必ずしも同じではないということです。

具体的にos.walkは、 に基づいて構築されてos.listdirいるため、Unicode パスを指定するかどうかに応じて、Unicode と 8 ビット バイトを切り替えます。

代わりに 8 ビット パスを渡すと、コードが正しく機能し、必要に応じて UTF-8 または ISO 8859-1 からデコードされます。

于 2012-07-27T14:01:28.487 に答える
0

文字エンコーディング検出を使用します。Python の chardet モジュールは、実際のエンコーディングをある程度確実に判断するのに適しています。「必要に応じて」 -- エンコーディングを知っているか、推測する必要があります。chardet の推測が間違っていたとしても、少なくとも試したことはあります。

于 2012-08-06T21:10:19.283 に答える