2011-08-17 49 views
49

私のpythonスクリプトはos.listdir(path)を実行します。パスは1つ1つ扱う必要のあるアーカイブを含むキューです。os.listdir()を使って隠しファイルを無視するには?

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

ここに私の質問があります:os.listdir()を実行すると隠されたファイルを無視する既存の機能がありますか?そうでない場合は何が最善の方法でしょうか?

ありがとうございます。

答えて

60

あなたは1を自分で書くことができます。

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

glob

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

これらのいずれも、'.'で始まるすべてのファイル名を無視します。 Windows、Linux、およびOS X上で

+1

を提案した関数 'listdir_nohidden'はyield''を使用するので、os.listdir' 'と非常に互換性がありません。それを発電機にする。代わりに、 'os.listdir'の出力リストを実行し、 '。'で始まるエントリを削除する必要があります。 – 0sh

+1

@ 0sh:なぜ物事をインプレースで取り除かなければならないのですか? 'list(listdir_nohidden(path))'を実行する新しい関数を定義するだけで、その新しい関数は 'os.listdir'と正確に互換性があります。 – abarnert

10

glob

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

(。globクレームはボンネットの下にlistdirfnmatchを使用するが、それはまたないfnmatchを使用することにより、リード'.'をチェック)

13

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で動作するはずです。隠しファイルはそこから '。'で始まります。同じように。 –

+0

これは唯一の移植可能な答えですが、素晴らしい仕事ですが、他の回答はos.listdirの完全なラッパーを提供していますので... '[f for os.listdir(path)in f in folder_is_hidden(f)]' – SensorSmith

12
filter(lambda f: not f.startswith('.'), os.listdir('.')) 
13

これは古い質問ですが、それはリストの内包表記を使用しての明白な答えが欠落しているように思えるので、私はそれをここに追加しています完全:サイドノートとして

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

、ドキュメントの状態listdirは、「任意の順番」で結果を返しますが、一般的な使用例は、それらがアルファベット順にソートすることです。あなたはアルファベット順に総額に関してせずにソートされたディレクトリの内容が必要な場合は、あなたが使用することができます。

sorted([f for f in os.listdir('./')], key=lambda f: f.lower()) 
0
filenames = (f.name for f in os.scandir() if not f.name.startswith('.')) 
関連する問題