Подтвердить что ты не робот

Используйте подстановочный знак с os.path.isfile()

Я хочу проверить, есть ли какие-либо файлы .rar в каталоге. он не должен быть рекурсивным.

Использование wildcard с os.path.isfile() было моим лучшим предположением, но это не сработало. Что я могу сделать тогда?

Спасибо.

4b9b3361

Ответ 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