web-dev-qa-db-fra.com

Utiliser un caractère générique avec os.path.isfile ()

Je voudrais vérifier s'il y a des fichiers .rar dans un répertoire. il n’a pas besoin d’être récursif.

Utiliser le joker avec os.path.isfile () était ma meilleure hypothèse, mais cela ne fonctionnait pas. Que puis-je faire alors?

Merci.

26
Alex

glob est ce dont vous avez besoin.

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

os.path.isfile() renvoie True si un chemin est un fichier régulier existant. Donc, cela est utilisé pour vérifier si un fichier existe déjà et ne supporte pas les caractères génériques. glob fait.

58
user225312

Sans utiliser os.path.isfile() vous ne saurez pas si les résultats renvoyés par glob() sont des fichiers ou des sous-répertoires, essayez plutôt quelque chose comme ceci:

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')

Vous pouvez également simplement filtrer les résultats renvoyés par glob() si vous le souhaitez, ce qui présente l’avantage de faire quelques opérations supplémentaires relatives à Unicode, etc. Vérifiez la source dans glob.py si cela compte.

[n for n in glob(pattern) if os.path.isfile(n)]
7
Peter Hansen

Les caractères génériques sont développés par Shell et vous ne pouvez donc pas les utiliser avec os.path.isfile ()

Si vous souhaitez utiliser des caractères génériques, vous pouvez utiliser popen with Shell = True ou 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

Vous pouvez également obtenir le même effet avec le module glob.

>>> import glob
>>> glob.glob('*.old')
['projecthelper.old']
>>> 
3
pyfunc
import os
[x for x in os.listdir("your_directory") if len(x) >= 4 and  x[-4:] == ".rar"]
2
Mariy

iglob est meilleur que glob ici car vous ne voulez pas réellement la liste complète des fichiers rar, mais vous voulez juste vérifier qu’il existe un rar

0
gnetscher

pour afficher le chemin complet et le filtre en fonction de l'extension,

import os
onlyfiles = [f for f in os.listdir(file) if len(f) >= 5 and  f[-5:] == ".json" and isfile(join(file, f))]
0
Som

Si vous vous souciez simplement de l'existence d'au moins un fichier et que vous ne voulez pas en avoir la liste:

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
Tchotchke