web-dev-qa-db-ja.com

ディレクトリに特定の拡張子を持つファイルが含まれているかどうかを確認します

現在のディレクトリを確認し、拡張子を持つファイルが存在するかどうかを確認する必要があります。私のセットアップでは、(通常)この拡張子を持つファイルは1つだけです。そのファイルが存在するかどうかを確認し、存在する場合はコマンドを実行する必要があります。

ただし、代替拡張子を持つ複数のファイルがあるため、elseを複数回実行します。ファイルが存在しない場合にのみelseを実行する必要があり、他のすべてのファイルに対して1回ではありません。私のコードサンプルは次のとおりです。


ディレクトリは次のように構成されています。

_dir_________________________________________
    \            \            \            \     
 file.false    file.false    file.true    file.false
_

実行すると:

_import os
for File in os.listdir("."):
    if File.endswith(".true"):
        print("true")
    else:
        print("false")
_

出力は次のとおりです。

_false
false
true
false
_

これの問題は、print("false")を何か有用なものに置き換えた場合、複数回実行されることです。

編集:2年前にこの質問をしましたが、まだ非常に穏やかな活動が見られます。 http://book.pythontips.com/en/latest/for_-_else.html#else-clause

15
spikespaz

elseforブロックを使用できます。

for fname in os.listdir('.'):
    if fname.endswith('.true'):
        # do stuff on the file
        break
else:
    # do stuff if a file .true doesn't exist.

elseにアタッチされたforは、ループ内のbreaknotであるときに実行されます実行されました。何かを検索する方法としてforループを考える場合、breakはその何かを見つけたかどうかを伝えます。 elseは、探しているものが見つからなかったときに実行されます。

代わりに:

if not any(fname.endswith('.true') for fname in os.listdir('.')):
    # do stuff if a file .true doesn't exist

さらに、globの代わりに listdir モジュールを使用できます。

import glob
# stuff
if not glob.glob('*.true')`:
    # do stuff if no file ending in .true exists
22
Bakuriu

ファイルが特定の拡張子で終わることだけを確認したい場合は、anyを使用します。

import os
if any(File.endswith(".true") for File in os.listdir(".")):
    print("true")
else:
    print("false")
10
Kevin

glob モジュールを使用して、目的のファイルを正確に検索する必要があります。

import glob

fileList = glob.glob("*.true")
for trueFile in fileList:
    doSomethingWithFile(trueFile)
4
bgporter