12

Unicodeファイル名のファイルを開くことができないようです。私がすることをしましょう:

for i in os.listdir():
    open(i, 'r')

解決策を検索しようとすると、Unicodeの名前が付いたファイルfile()やファイルを開く方法ではなく、Unicode文字列の読み取りと書き込みの方法に関するページが常に表示されますopen()

4

2 に答える 2

28

open()ファイル名にUnicode文字列を渡すだけです。

Python 2.xの場合:

>>> open(u'someUnicodeFilenameλ')
<open file u'someUnicodeFilename\u03bb', mode 'r' at 0x7f1b97e70780>

Python 3.xでは、すべての文字列がUnicodeであるため、文字通り何もありません。

いつものように、ファイルを開く最良の方法は、常にwithステートメントを。と組み合わせて使用​​することであることに注意してくださいopen()

編集:アドバイスに関してはos.listdir()、Python 2.xでは、次の点に注意する必要があります。

ファイル名を返すos.listdir()は、問題を引き起こします。Unicodeバージョンのファイル名を返す必要がありますか、それともエンコードされたバージョンを含む8ビット文字列を返す必要がありますか?os.listdir()は、ディレクトリパスを8ビット文字列として指定したかUnicode文字列として指定したかに応じて、両方を実行します。パスとしてUnicode文字列を渡すと、ファイルシステムのエンコーディングを使用してファイル名がデコードされ、Unicode文字列のリストが返されます。一方、8ビットパスを渡すと、ファイル名の8ビットバージョンが返されます。

ソース

つまり、Unicodeを出力したい場合は、Unicodeを次のように入力します。

>>> os.listdir(".")
['someUnicodeFilename\xce\xbb', 'old', 'Dropbox', 'gdrb']
>>> os.listdir(u".")
[u'someUnicodeFilename\u03bb', u'old', u'Dropbox', u'gdrb']

ファイルはどちらの方法でも開くことに注意してください。8ビットの文字列になるため、Python内では適切に表現されませんが、引き続き機能します。

open('someUnicodeFilename\xce\xbb')
<open file 'someUnicodeFilenameλ', mode 'r' at 0x7f1b97e70660>

3.xでは、いつものように、常にUnicodeです。

于 2012-04-16T20:00:57.220 に答える
8

あなたはこれを試すことができます:

import os
import sys

for filename in os.listdir(u"/your-direcory-path/"):
  open(filename.encode(sys.getfilesystemencoding()), "r")
于 2012-04-16T20:10:32.303 に答える