Я хочу проверить, есть ли какие-либо файлы .rar в каталоге. он не должен быть рекурсивным.
Использование wildcard с os.path.isfile() было моим лучшим предположением, но это не сработало. Что я могу сделать тогда?
Спасибо.
Я хочу проверить, есть ли какие-либо файлы .rar в каталоге. он не должен быть рекурсивным.
Использование wildcard с 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"]
iglob лучше, чем glob здесь, так как вы действительно не хотите полный список файлов rar, но просто хотите проверить, существует ли один rar
Если вам просто интересно, существует ли хотя бы один файл и вам не нужен список файлов:
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 os
onlyfiles = [f for f in os.listdir(file) if len(f) >= 5 and f[-5:] == ".json" and isfile(join(file, f))]
Просто еще один метод для выполнения работы с использованием подпроцесса.
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