os.listdir()を使用して隠しファイルを無視する方法は?


88

私のPythonスクリプトはos.listdir(path)、パスが1つずつ処理する必要のあるアーカイブを含むキューである場所を実行します。

問題は、リストを配列で取得してから、単純なを実行することarray.pop(0)です。プロジェクトを転覆させるまでは問題なく動作していました。これ.svnで、配列内のフォルダーを取得しました。もちろん、アプリケーションがクラッシュします。

だからここに私の質問があります:実行時に隠しファイルを無視する関数はありますos.listdir()か?そうでない場合は何が最善の方法ですか?


os.path.isdir()
HashRocketSyntax 2010

回答:


103

自分で書くことができます:

def listdir_nohidden(path):
    for f in os.listdir(path):
        if not f.startswith('.'):
            yield f

または、グロブを使用できます:

def listdir_nohidden(path):
    return glob.glob(os.path.join(path, '*'))

これらのいずれも、で始まるすべてのファイル名を無視します'.'


1
提案された関数listdir_nohiddenos.listdir、を使用yieldするとジェネレーターになるため、とは完全に互換性がありません。代わりにos.listdir、「。」で始まるエントリから出力リストを実行して削除する必要があります。
Milo Wielondek 2012年

3
@ 0sh:なぜその場で物を取り除く必要があるのですか?する新しい関数を定義するだけでlist(listdir_nohidden(path))、その新しい関数はと完全に互換性がありos.listdirます。
abarnert 2013年

50

これは古い質問ですが、リスト内包表記を使用するという明白な答えが欠けているように思われるので、完全を期すためにここに追加します。

[f for f in os.listdir(path) if not f.startswith('.')]

補足として、docs状態listdirは結果を「任意の順序」で返しますが、一般的な使用例は、結果をアルファベット順にソートすることです。大文字と小文字を区別せずにディレクトリの内容をアルファベット順に並べ替える場合は、次を使用できます。

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())

5
key=lambda f: f.lower()ラムダずに書き込むことができます:key=str.lower
ジャン=フランソワ・ファーブル

2
両方を組み合わせるには:sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
ロバート

19

Windows、Linux、およびOS Xの場合:

if os.name == 'nt':
    import win32api, win32con


def folder_is_hidden(p):
    if os.name== 'nt':
        attribute = win32api.GetFileAttributes(p)
        return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM)
    else:
        return p.startswith('.') #linux-osx

2
Macでも動作するはずです。隠しファイルは「。」で始まります。同様に。
Verena Haunschmid 2013年

2
これは唯一の移植可能な答えであり、素晴らしい仕事ですが、他の答えはos.listdirの完全なラッパーを提供するので...[f for f in os.listdir(path) if not folder_is_hidden(f)]
SensorSmith 2016年


14

グロブ

>>> import glob
>>> glob.glob('*')

glob使用するlistdirと主張しfnmatch、ボンネットの下にありますが、'.'を使用するのではなく、先頭をチェックしfnmatchます。)


6

すべての項目をループで処理するのは大変な作業だと思います。私はこのようなもっと単純なものを好みます:

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')

ディレクトリに複数の隠しファイルが含まれている場合、これは次の場合に役立ちます。

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')

@Joshが言ったように、プラットフォームの独立性のために、globはうまく機能します:

import glob
glob.glob('*')

それはあなたが持っている場合にのみ機能1つの隠されたファイルを、そしてあなたはそれの名前を知っています。ディレクトリに、事前にわからない任意の名前の隠しファイルが数十個含まれている場合はどうなりますか?
FeRD

こんにちは@FeRD、はい。Macでバッチ/バックログ処理を行っているときは、すべてのファイルを新しいフォルダーに入れて、.DS_Store自動的に作成します。すべてのファイルを圧縮してサーバーにプッシュすると、.DS_Store追加されます。さまざまな隠しファイルがある場合は、試してみることができますos.system('ls -1')
ユーザー9232 2719

クロスプラットフォームではありません。os.popen('ls -1').read()Windowsでは動作しません。それがの要点ですos.listdir()
FeRD

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.