web-dev-qa-db-ja.com

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

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

問題は、配列内のリストを取得してから、単純なarray.pop(0)を実行するだけです。 Subversionにプロジェクトを配置するまで、うまく機能していました。ここで、配列に_.svn_フォルダーを取得します。もちろん、アプリケーションがクラッシュします。

だからここに私の質問です:os.listdir()を実行するときに隠しファイルを無視する既存の関数はありますか?

ありがとうございました。

68
talnicolas

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

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, '*'))

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

79
Adam Rosenfield

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

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

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

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

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
16
cle
filter( lambda f: not f.startswith('.'), os.listdir('.'))
12
scum

glob

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

globは内部でlistdirfnmatchを使用すると主張しますが、先頭の'.'fnmatchを使用したものではありません。)

11
Josh Lee

すべてのアイテムをループで処理するのは大変な作業だと思います。私はこのような簡単なものを好むでしょう:

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')
6
user 923227
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
1
amenbo