2017-09-03 11 views
0

Windowsのディレクトリには、2つのファイルがあり、その両方に名前のアクセント付き文字:t1û.fnt2ű.fnがあります。両方とも正しくコマンドプロンプトショーでdirコマンド:WindowsのPython 2で名前にアクセント付き文字を含むファイルを開く

S:\p>dir t*.fn 
Volume in drive S is q 
Volume Serial Number is 05A0-8823 

Directory of S:\p 

2017-09-03 14:54     4 t1û.fn 
2017-09-03 14:54     4 t2ű.fn 
       2 File(s)    8 bytes 
       0 Dir(s) 19,110,621,184 bytes free 

スクリーンショット:

screenshot of dir

しかし、Pythonは両方のファイルを見ることができない。

S:\p>python -c "import os; print [(fn, os.path.isfile(fn)) for fn in os.listdir('.') if fn.endswith('.fn')]" 
[('t1\xfb.fn', True), ('t2u.fn', False)] 

これは、Pythonのように見えます2はファイル名に1バイトのAPIを使用するため、t1û.fnのアクセント付き文字は1バイトの\xfbにマッピングされ、acce t2ű.fnのnted文字は、アクセントのないASCIIシングルバイトuにマップされます。

Python 2のWindowsでファイル名にマルチバイトAPIを使用するにはどうすればよいですか?私はWindows上のPython 2のコンソール版で両方のファイルを開きたいです。

+0

は、 'パスbytes'この動作のためのWindows上で廃止されていることに注意してください。ファイルシステムのエンコーディングを仮定して3.6+で返された 'bytes'パスのサポートはUTF-8です。 3.6では、 ''t1û.fn ''に加えて' b't1 \ xc3 \ xbb.fn''を開くことができ、 'os.listdir(b'。 ')'はファイル名をUTF-8としてエンコードします。内部的には、Windowsのワイド文字APIを使用するためにUTF-16にトランスコードされます。 – eryksun

答えて

1

Unicode文字列を使用しますFYI、ケースであなたは、Python 3にジャンプさせる

f1 = open(u"t1\u00fb.fn")  # t1û.fn 
f2 = open(u"t2\u0171.fn")  # t2ű.fn 
+0

ありがとうございます、 'open'のために動作します。また 'os.listdir(u '。')'は、右のアクセント付き文字を含むファイル名を返します。 – pts

関連する問題