Используйте подстановочный знак с os.path.isfile()
Я хочу проверить, есть ли какие-либо файлы .rar в каталоге. он не должен быть рекурсивным.
Использование wildcard с os.path.isfile() было моим лучшим предположением, но это не сработало. Что я могу сделать тогда?
Спасибо.
Ответы
Ответ 1
glob - это то, что вам нужно.
>>> import glob
>>> glob.glob('*.rar') # all rar files within the directory, in this case the current working one
os.path.isfile()
возвращает True
, если путь является существующим обычным файлом. Таким образом, это используется для проверки того, существует ли файл уже и не поддерживает подстановочные знаки. glob
делает.
Ответ 2
Без использования 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)]
Ответ 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']
>>>
Ответ 4
import os
[x for x in os.listdir("your_directory") if len(x) >= 4 and x[-4:] == ".rar"]
Ответ 5
iglob лучше, чем glob здесь, так как вы действительно не хотите полный список файлов rar, но просто хотите проверить, существует ли один rar
Ответ 6
Если вам просто интересно, существует ли хотя бы один файл и вам не нужен список файлов:
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
Ответ 7
отображать полный путь и фильтр на основе расширения,
import os
onlyfiles = [f for f in os.listdir(file) if len(f) >= 5 and f[-5:] == ".json" and isfile(join(file, f))]
Ответ 8
Просто еще один метод для выполнения работы с использованием подпроцесса.
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