16

Windowsでは大文字と小文字は区別されませんが、ファイル名では大文字と小文字が区別されます。Pythonでは、ファイルシステムに保存されているときに大文字と小文字を区別してファイル名を取得する方法はありますか?

たとえば、Pythonプログラムでは、filename = "texas.txt"がありますが、これがさまざまなファイル操作にとって重要ではない場合でも、実際にはファイルシステムに"TEXAS.txt"が保存されていることを知りたいです。

4

6 に答える 6

10

これを行う最も簡単な方法は次のとおりです。

>>> import win32api
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt')))
'TEXAS.txt'
于 2010-01-22T04:33:51.620 に答える
6

上記のwin32apiソリューションで特殊文字に問題がありました。Unicodeファイル名の場合は、次を使用する必要があります。

win32api.GetLongPathNameW(win32api.GetShortPathName(path))
于 2011-10-01T19:33:50.337 に答える
3

これは標準ライブラリのみであり、すべてのパス部分(ドライブ文字を除く)を変換します。

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
于 2016-08-25T08:44:54.437 に答える
1
>>> import os
>>> os.listdir("./")
['FiLeNaMe.txt']

これはあなたの質問に答えますか?

于 2010-01-21T23:48:43.397 に答える
1

あなたが使用することができます:

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'が小文字であることを前提としています。そうでない場合は、最初に小文字に変換する必要があります。

于 2010-01-21T23:50:06.920 に答える
1

ディレクトリを再帰したい場合

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 )
于 2010-01-22T00:48:03.987 に答える