Use wildcard with os.path.isfile()
I'd like to check if there are any .rar
files in a directory. It doesn’t need to be recursive.
Using wildcard with os.path.isfile()
was my best guess, but it doesn't work. W开发者_运维问答hat can I do then?
glob is what you need.
>>> import glob
>>> glob.glob('*.rar') # all rar files within the directory, in this case the current working one
os.path.isfile()
returns True
if a path is an existing regular file. So that is used for checking whether a file already exists and doesn't support wildcards. glob
does.
Without using os.path.isfile()
you won't know whether the results returned by glob()
are files or subdirectories, so try something like this instead:
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')
You could also just filter the results returned by glob()
if you like, and that has the advantage of doing a few extra things relating to unicode and the like. Check the source in glob.py if it matters.
[n for n in glob(pattern) if os.path.isfile(n)]
import os
[x for x in os.listdir("your_directory") if len(x) >= 4 and x[-4:] == ".rar"]
Wildcards are expanded by shell and hence you can not use it with os.path.isfile()
If you want to use wildcards, you could use popen with shell = True
or 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
You could get the same effect with glob module too.
>>> import glob
>>> glob.glob('*.old')
['projecthelper.old']
>>>
If you just care about whether at least one file exists and you don't want a list of the files:
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
to display full path and filter based on extension,
import os
onlyfiles = [f for f in os.listdir(file) if len(f) >= 5 and f[-5:] == ".json" and isfile(join(file, f))]
Just another method to get the job done using subprocess.
import subprocess
try:
q = subprocess.check_output('ls')
if ".rar" in q:
print "Rar exists"
except subprocess.CalledProcessError as e:
print e.output
Reference : https://docs.python.org/2/library/subprocess.html#subprocess.check_output
iglob is better than glob here since you do not actually want the full list of rar files, but just want to check that one rar exists
精彩评论