My pythonスクリプトはos.listdir(path)
を実行します。パスは、1つずつ処理する必要があるアーカイブを含むキューです。
問題は、配列内のリストを取得してから、単純なarray.pop(0)
を実行するだけです。 Subversionにプロジェクトを配置するまで、うまく機能していました。ここで、配列に_.svn
_フォルダーを取得します。もちろん、アプリケーションがクラッシュします。
だからここに私の質問です:os.listdir()
を実行するときに隠しファイルを無視する既存の関数はありますか?
ありがとうございました。
自分で書くことができます:
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, '*'))
これらのいずれも、'.'
で始まるすべてのファイル名を無視します。
これは古い質問ですが、リスト内包表記を使用する明白な答えが欠落しているようですので、完全を期すためにここに追加します。
[f for f in os.listdir(path) if not f.startswith('.')]
補足として、ドキュメントの状態listdir
は結果を「任意の順序」で返しますが、一般的な使用例はアルファベット順にソートすることです。大文字と小文字を区別せずにディレクトリの内容をアルファベット順にソートする場合は、次を使用できます。
sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
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
filter( lambda f: not f.startswith('.'), os.listdir('.'))
glob :
>>> import glob
>>> glob.glob('*')
(glob
は内部でlistdir
とfnmatch
を使用すると主張しますが、先頭の'.'
、fnmatch
を使用したものではありません。)
すべてのアイテムをループで処理するのは大変な作業だと思います。私はこのような簡単なものを好むでしょう:
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')
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))