Windowsでは大文字と小文字は区別されませんが、ファイル名では大文字と小文字が区別されます。Pythonでは、ファイルシステムに保存されているときに大文字と小文字を区別してファイル名を取得する方法はありますか?
たとえば、Pythonプログラムでは、filename = "texas.txt"がありますが、これがさまざまなファイル操作にとって重要ではない場合でも、実際にはファイルシステムに"TEXAS.txt"が保存されていることを知りたいです。
これを行う最も簡単な方法は次のとおりです。
>>> import win32api
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt')))
'TEXAS.txt'
上記のwin32apiソリューションで特殊文字に問題がありました。Unicodeファイル名の場合は、次を使用する必要があります。
win32api.GetLongPathNameW(win32api.GetShortPathName(path))
これは標準ライブラリのみであり、すべてのパス部分(ドライブ文字を除く)を変換します。
def casedpath(path):
r = glob.glob(re.sub(r'([^:/\\])(?=[/\\]|$)|\[', r'[\g<0>]', path))
return r and r[0] or path
そしてこれはさらにUNCパスを処理します:
def casedpath_unc(path):
unc, p = os.path.splitunc(path)
r = glob.glob(unc + re.sub(r'([^:/\\])(?=[/\\]|$)|\[', r'[\g<0>]', p))
return r and r[0] or path
注:ファイルシステムに依存するWin APIの「GetShortPathName」メソッドよりも多少低速ですが、プラットフォームとファイルシステムに依存せず、Windowsボリュームで短いファイル名の生成がオフになっている場合にも機能します(fsutil.exe 8dot3name query C:
)。後者は、16ビットアプリがこれに依存しなくなったときに、少なくともパフォーマンスが重要なファイルシステムに推奨されます。
fsutil.exe behavior set disable8dot3 1
>>> import os
>>> os.listdir("./")
['FiLeNaMe.txt']
これはあなたの質問に答えますか?
あなたが使用することができます:
import os
a = os.listdir('mydirpath')
b = [f.lower() for f in a]
try:
i = b.index('texas.txt')
print a[i]
except ValueError:
print('File not found in this directory')
もちろん、これは検索文字列'texas.txt'
が小文字であることを前提としています。そうでない場合は、最初に小文字に変換する必要があります。
ディレクトリを再帰したい場合
import os
path=os.path.join("c:\\","path")
for r,d,f in os.walk(path):
for file in f:
if file.lower() == "texas.txt":
print "Found: ",os.path.join( r , file )