我想检查目录中是否有.rar文件。它不需要递归。
使用带有os.path.isfile()的通配符是我最好的猜测,但它不起作用。那我该怎么办?
感谢。
答案 0 :(得分:63)
glob就是您所需要的。
>>> import glob
>>> glob.glob('*.rar') # all rar files within the directory, in this case the current working one
如果路径是现有常规文件,则 os.path.isfile()
返回True
。因此,它用于检查文件是否已存在且不支持通配符。 glob
确实如此。
答案 1 :(得分:7)
如果不使用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)]
答案 2 :(得分:3)
通配符扩展了通配符,因此您无法将其与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']
>>>
答案 3 :(得分:3)
import os
[x for x in os.listdir("your_directory") if len(x) >= 4 and x[-4:] == ".rar"]
答案 4 :(得分:0)
iglob比glob更好,因为你实际上并不想要rar文件的完整列表,只是想检查一个rar是否存在
答案 5 :(得分:0)
如果您只关心是否存在至少一个文件而您不想要文件列表:
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
答案 6 :(得分:0)
显示完整路径和基于扩展名的过滤器,
import os
onlyfiles = [f for f in os.listdir(file) if len(f) >= 5 and f[-5:] == ".json" and isfile(join(file, f))]
答案 7 :(得分:0)
另一种使用子流程完成工作的方法。
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