2010-11-28 11 views
22

Ich würde gerne überprüfen, ob es irgendwelche .rar-Dateien in einem Verzeichnis gibt. es muss nicht rekursiv sein.Verwenden Sie Platzhalter mit os.path.isfile()

Verwenden von Platzhalter mit os.path.isfile() war meine beste Schätzung, aber es funktioniert nicht. Was kann ich dann tun?

Danke.

+3

Sie sollten eine Antwort auf diese Frage annehmen ... – GreenAsJade

Antwort

2

Wildcards werden durch Shell erweitert und somit können Sie es nicht mit os.path.isfile() verwenden

Wenn Sie Platzhalter verwenden möchten, können Sie verwenden popen with shell = True oder 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 

Sie können den gleichen Effekt auch mit dem Glob-Modul erzielen.

>>> import glob 
>>> glob.glob('*.old') 
['projecthelper.old'] 
>>> 
49

glob ist was Sie brauchen.

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

os.path.isfile() kehrt True wenn ein Pfad eine vorhandene reguläre Datei ist. Damit wird überprüft, ob eine Datei bereits existiert und keine Platzhalter unterstützt. glob tut.

+0

+1 Sie schlugen mich nur daran, während ich versuchte, eine vollständige Antwort zu ziehen. – pyfunc

+1

Leider, ohne os.path.isfile() zu verwenden, um die Ergebnisse zu überprüfen, wissen Sie immer noch nicht, ob das, was Sie gefunden haben, Verzeichnisse oder Dateien sind. –

2
import os 
[x for x in os.listdir("your_directory") if len(x) >= 4 and x[-4:] == ".rar"] 
4

Ohne os.path.isfile() verwenden werden Sie nicht wissen, ob die von glob() zurückgegebenen Ergebnisse sind Dateien oder Unterverzeichnisse, so versuchen, so etwas wie dieses stattdessen:

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

Sie können auch filtern, dass nur die von glob() zurückgegebenen Ergebnisse wenn Sie möchten, und das hat den Vorteil, ein paar zusätzliche Dinge in Bezug auf Unicode und dergleichen zu tun. Überprüfen Sie die Quelle in glob.py, wenn es darauf ankommt.

[n for n in glob(pattern) if os.path.isfile(n)] 
+0

Wenn du sagst "das hat den Vorteil", meinst du "glob" hat den Vorteil oder "fnmatch" hat den Vorteil? –

+1

@RichardCorden, habe ich es umformuliert, um klarzustellen, dass Glob dort den Vorteil hat. –

0

iglob ist besser als glob hier, da Sie eigentlich gar nicht die vollständige Liste der rar-Dateien wollen, aber wollen nur überprüfen, ob ein rar

+3

Obwohl dies tatsächlich zutrifft, würde diese Antwort von einer ausführlicheren Erklärung profitieren. Der Unterschied ist, dass 'iglob' einen Iterator zurückgibt. Wenn Sie ihn also einmal aufrufen und etwas zurückgibt, wissen Sie, dass es mindestens eine Übereinstimmung gab. – tripleee

0

existiert Wenn Sie nur interessieren, ob mindestens eine Datei vorhanden ist und Sie nicht wollen, um eine Liste der Dateien:

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 
Verwandte Themen