ディレクトリに.rarファイルがあるかどうかを確認したいと思います。再帰的である必要はありません。
Os.path.isfile()でワイルドカードを使用するのが最善の推測でしたが、機能しません。それで私は何ができますか?
ありがとう。
glob が必要です。
_>>> import glob
>>> glob.glob('*.rar') # all rar files within the directory, in this case the current working one
_
os.path.isfile()
は、パスが既存の通常ファイルの場合、True
を返します。そのため、ファイルが既に存在するかどうかを確認するために使用され、ワイルドカードをサポートしていません。 glob
は。
os.path.isfile()
を使用しないと、 glob()
によって返される結果がファイルなのかサブディレクトリなのかわかりません。代わりに:
_import fnmatch
import os
def find_files(base, pattern):
'''Return list of files matching pattern in base folder.'''
return [n for n in fnmatch.filter(os.listdir(base), pattern) if
os.path.isfile(os.path.join(base, n))]
rar_files = find_files('somedir', '*.rar')
_
また、必要に応じてglob()
によって返される結果をフィルタリングすることもできます。これには、Unicodeなどに関連するいくつかの追加の処理を行うという利点があります。問題があればglob.pyのソースを確認してください。
_[n for n in glob(pattern) if os.path.isfile(n)]
_
ワイルドカードはシェルによって展開されますしたがって、os.path.isfile()で使用することはできません
ワイルドカードを使用する場合は、_popen with Shell = True
_またはos.system()
を使用できます
_>>> import os
>>> os.system('ls')
aliases.sh
default_bashprofile networkhelpers projecthelper.old pythonhelpers virtualenvwrapper_bashrc
0
>>> os.system('ls *.old')
projecthelper.old
0
_
Globモジュールでも同じ効果を得ることができます。
_>>> import glob
>>> glob.glob('*.old')
['projecthelper.old']
>>>
_
import os
[x for x in os.listdir("your_directory") if len(x) >= 4 and x[-4:] == ".rar"]
少なくとも1つのファイルが存在するかどうかだけに関心があり、ファイルのリストが必要ない場合:
import glob
import os
def check_for_files(filepath):
for filepath_object in glob.glob(filepath):
if os.path.isfile(filepath_object):
return True
return False
サブプロセスを使用してジョブを完了する別の方法。
import subprocess
try:
q = subprocess.check_output('ls')
if ".rar" in q:
print "Rar exists"
except subprocess.CalledProcessError as e:
print e.output
リファレンス: https://docs.python.org/2/library/subprocess.html#subprocess.check_output
iglobは、実際にはrarファイルの完全なリストが必要ではなく、1つのrarが存在することを確認するだけなので、globよりも優れています
拡張子に基づいてフルパスとフィルターを表示するには、
import os
onlyfiles = [f for f in os.listdir(file) if len(f) >= 5 and f[-5:] == ".json" and isfile(join(file, f))]