Используйте подстановочный знак с os.path.isfile () - PullRequest
29 голосов
/ 28 ноября 2010

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

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

Спасибо.

Ответы [ 8 ]

64 голосов
/ 28 ноября 2010

glob - это то, что вам нужно.

>>> import glob
>>> glob.glob('*.rar')   # all rar files within the directory, in this case the current working one

os.path.isfile() возвращает True, если путь является существующим обычным файлом. Так что это используется для проверки того, что файл уже существует и не поддерживает подстановочные знаки. glob делает.

7 голосов
/ 28 ноября 2010

Без использования 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(), если хотите, и у этого есть преимущество, если вы сделаете несколько дополнительных вещей, связанных с юникодом и тому подобным. Проверьте источник в glob.py, если это имеет значение.

[n for n in glob(pattern) if os.path.isfile(n)]
3 голосов
/ 28 ноября 2010
import os
[x for x in os.listdir("your_directory") if len(x) >= 4 and  x[-4:] == ".rar"]
3 голосов
/ 28 ноября 2010

Подстановочные знаки расширяются с помощью оболочки , поэтому вы не можете использовать ее с 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']
>>> 
0 голосов
/ 03 июня 2019

Просто еще один метод выполнения работы с использованием подпроцесса.

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

0 голосов
/ 28 января 2019

для отображения полного пути и фильтра на основе расширения,

import os
onlyfiles = [f for f in os.listdir(file) if len(f) >= 5 and  f[-5:] == ".json" and isfile(join(file, f))]
0 голосов
/ 08 декабря 2016

Если вам важно знать, существует ли хотя бы один файл, и вам не нужен список файлов:

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
0 голосов
/ 04 июля 2016

iglob здесь лучше, чем glob, так как вы на самом деле не хотите полный список файлов rar, а просто хотите проверить, существует ли один rar

...