2012-03-31 6 views
4

を印刷しませんLISTDIRは、Pythonの2.7上で正しく英語以外の文字

for dir in os.listdir("E:/Library/Documents/Old - Archives/Case"): 
    print dir 

プリントアウト:このしばらく

Danny.xlsx 
Dannyh.xlsx 
~$??? ?? ?????? ??? ???? ???????.docx 

# using a unicode literal 
for dir in os.listdir(u"E:/Library/Documents/Old - Archives/Case"): 
    print dir 

プリントアウト:

Dan.xlsx 
Dann.xlsx 

Traceback (most recent call last): 
    File "E:\...\FirstModule.py", line 31, in <module> 
    print dir 
    File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 2-4: character maps to <undefined> 

ファイル名はヘブライ語で、次のようになります。המסמך.xls

ヘブライ語でもPythonで表示させるにはどうすればよいですか?

+0

もっと奇妙な: 's = os.listdir(u" E:/ライブラリ/ Documents/Old - Archives/Case "[2] print s'はうまく動作します。 – mirandalol

+0

解決しました:文書の先頭にある '# - * - coding:utf-8 - * - ' が解決しました。 – mirandalol

+2

あなた自身の問題を解決するときは、答えをコメントではなく回答として投稿し、それを受け入れるべきです。 – agf

答えて

1

解決済み:# -*- coding: utf-8 -*-が解決しました。

+0

これは説明されているように問題を解決することはできません。同時に何かが変わっていなければならなかった。そのコメントは、ソースコードのみを宣言し、Python 2で非ASCIIのソースファイルにのみ影響します。この例はASCIIだけなので、これは0の効果を持ちます。さらにOPも 'listdir'のUnicode文字列に同時に変更されました。 –

6

u''文字列リテラルのバージョンはうまくいきます:Unicodeパス名を入力すると、現在のコードページ外の文字を含むファイル名で作業できるように、Unicodeパス名が返されます。

あなたの問題は、ファイル名がprintの場合にのみ発生します。 Unicode出力をWindowsのコマンドプロンプトに表示することは試用です。

デフォルトのC標準ライブラリの印刷機能は、ロケールコードページに限定されています。 Win32 API関数WriteConsoleWを直接(ctypesを使って)呼び出さない限り、信頼できるコンソールUnicodeサポートを得ることはできません。適切な非デフォルトフォントが選択されていなければ動作しません。これはPythonだけでなく、ネイティブでないコマンドラインツールにもほとんど影響します。

+0

これは私が探していたものです!私はフォルダ名を読んで、私はPythonが私に与えるエンコードを知らない。私はUnicodeコードポイントの値を取得する前に、いくつかのコーデック名でデコードを推測しなければなりませんでした。これは実際に問題を解決します。 – off99555

+0

実際には、pythonは私のためのコードを推論しませんでした。それはちょうど私に16進値の形式でバイトを与え、私は自分自身でそれらのファイル名のエンコーディングを見つけることができます。 – off99555

1

出力コンソールでエラーメッセージごとにcp1252エンコーディングが使用されており、そのエンコーディングでヘブライ語を印刷できないという問題があります。 UTF-8をサポートするIDEと、そのIDEの中でヘブライ語をサポートするフォントを使用してください。os.listdirをUnicodeパスで使用すると正しく動作します。

ここでは、ユニコードパスを使用する場合と使用しない場合のPythonWin IDEの例を示します。

PythonWin 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32. 
Portions Copyright 1994-2008 Mark Hammond - see 'Help/About PythonWin' for further copyright information. 
>>> import os 
>>> for f in os.listdir('.'): 
...  print f 
...  
x.exe 
x.py 
x.pyc 
y.py 
?????.xls 
>>> for f in os.listdir(u'.'): 
...  print f 
...  
x.exe 
x.py 
x.pyc 
y.py 
המסמך.xls 

はまた、あなたのソースファイル内のエンコーディング宣言は出力を生成するための何ももしないことに注意してください。 のみが、ソースファイル内にASCII以外の文字を書き込む機能に影響する、ソースファイルがどのエンコードに保存されるかを宣言します。

関連する問題