Frage

Ich versuche, eine Liste von Dateien in einem Verzeichnis zu erhalten Python, aber ich will nicht, um eine Liste aller Dateien.

Was ich im Wesentlichen will, ist die Fähigkeit, so etwas wie die folgenden zu tun, sondern mit Python und nicht der Ausführung ls.

ls 145592*.jpg

Wenn es keine integrierte Methode dafür ist, ich bin derzeit denke an eine for-Schleife schriftlich über die Ergebnisse einer os.listdir() iterieren und alle die passenden Dateien auf eine neue Liste anzuhängen.

Allerdings gibt es eine Menge von Dateien in diesem Verzeichnis und daher hoffe ich, ist eine effizientere Methode (oder eine integrierte Methode).

War es hilfreich?

Andere Tipps

glob.glob() ist definitiv der Weg, es zu tun (wie pro Ignacio). Wenn Sie jedoch kompliziertere Anpassungs tun müssen, können Sie es mit einer Liste Verständnis tun und re.match(), so etwas wie so:

files = [f for f in os.listdir('.') if re.match(r'[0-9]+.*\.jpg', f)]

Flexiblere, aber wie Sie beachten, weniger effizient.

Halten Sie es einfach:

import os
relevant_path = "[path to folder]"
included_extensions = ['jpg','jpeg', 'bmp', 'png', 'gif']
file_names = [fn for fn in os.listdir(relevant_path)
              if any(fn.endswith(ext) for ext in included_extensions)]

Ich ziehe diese Form der Listenkomprehensionen, weil es gut in Englisch liest.

las ich die vierte Zeile wie:   Für jeden für meinen Weg in os.listdir fn, gib mir nur diejenigen, die eines meiner eingeschlossenen Erweiterungen entsprechen.

Es kann für Anfänger Python-Programmierer schwer sein, wirklich zu verwenden Listenkomprehensionen zum Filtern gewöhnungs, und es kann für sehr große Datenmengen einige Speicher-Overhead, sondern ein Verzeichnis und andere einfache Zeichenfolge Filteraufgaben für die Auflistung, Listenkomprehensionen führen mehr sauber dokumentierbar Code.

Das einzige, was über diesen Entwurf ist, dass es Sie nicht schützt vor machen den Fehler, eine Zeichenfolge statt einer Liste übergeben. Zum Beispiel, wenn Sie versehentlich eine Zeichenfolge in eine Liste konvertieren und die Charaktere Prüfung gegen alle einen Strings am Ende, man könnte am Ende eine ganze Reihe von Fehlalarmen zu bekommen.

Aber es ist besser, ein Problem zu haben, die als eine Lösung zu beheben einfach ist, die schwer zu verstehen ist.

Eine weitere Option:

>>> import os, fnmatch
>>> fnmatch.filter(os.listdir('.'), '*.py')
['manage.py']

https://docs.python.org/3/library/fnmatch.html

Verwendung os.walk rekursiv Ihre Dateien auflisten

import os
root = "/home"
pattern = "145992"
alist_filter = ['jpg','bmp','png','gif'] 
path=os.path.join(root,"mydir_to_scan")
for r,d,f in os.walk(path):
    for file in f:
        if file[-3:] in alist_filter and pattern in file:
            print os.path.join(root,file)

Vorläufiger Code

import glob
import fnmatch
import pathlib
import os

pattern = '*.py'
path = '.'

Lösung 1 - verwenden "glob"

# lookup in current dir
glob.glob(pattern)

In [2]: glob.glob(pattern)
Out[2]: ['wsgi.py', 'manage.py', 'tasks.py']

Lösung 2 - use "os" + "fnmatch"

Variant 2.1 - Lookup in aktuellem Verzeichnis

# lookup in current dir
fnmatch.filter(os.listdir(path), pattern)

In [3]: fnmatch.filter(os.listdir(path), pattern)
Out[3]: ['wsgi.py', 'manage.py', 'tasks.py']

Variant 2.2 - Lookup rekursive

# lookup recursive
for dirpath, dirnames, filenames in os.walk(path):

    if not filenames:
        continue

    pythonic_files = fnmatch.filter(filenames, pattern)
    if pythonic_files:
        for file in pythonic_files:
            print('{}/{}'.format(dirpath, file))

Ergebnis

./wsgi.py
./manage.py
./tasks.py
./temp/temp.py
./apps/diaries/urls.py
./apps/diaries/signals.py
./apps/diaries/actions.py
./apps/diaries/querysets.py
./apps/library/tests/test_forms.py
./apps/library/migrations/0001_initial.py
./apps/polls/views.py
./apps/polls/formsets.py
./apps/polls/reports.py
./apps/polls/admin.py

Lösung 3 - verwenden "pathlib"

# lookup in current dir
path_ = pathlib.Path('.')
tuple(path_.glob(pattern))

# lookup recursive
tuple(path_.rglob(pattern))

Weitere Informationen:

  1. Getestet auf dem Python 3.4
  2. Das Modul "pathlib" wurde nur in dem Python 3.4
  3. hinzugefügt
  4. Der Python 3.5 hinzugefügt, um eine Funktion für rekursive Lookup mit glob.glob https://docs.python.org/3.5/library/glob.html # glob.glob . Da meine Maschine mit Python 3.4 installiert ist, ich habe das nicht getestet.

Filter mit glob Modul:

Import glob

import glob

Wild Cards:

files=glob.glob("data/*")
print(files)

Out:

['data/ks_10000_0', 'data/ks_1000_0', 'data/ks_100_0', 'data/ks_100_1',
'data/ks_100_2', 'data/ks_106_0', 'data/ks_19_0', 'data/ks_200_0', 'data/ks_200_1', 
'data/ks_300_0', 'data/ks_30_0', 'data/ks_400_0', 'data/ks_40_0', 'data/ks_45_0', 
'data/ks_4_0', 'data/ks_500_0', 'data/ks_50_0', 'data/ks_50_1', 'data/ks_60_0', 
'data/ks_82_0', 'data/ks_lecture_dp_1', 'data/ks_lecture_dp_2']

Fiter Erweiterung .txt:

files = glob.glob("/home/ach/*/*.txt")

Ein einzelne Zeichen

glob.glob("/home/ach/file?.txt")

Nummernkreise

glob.glob("/home/ach/*[0-9]*")

Alphabet Bereiche

glob.glob("/home/ach/[a-c]*")

Sie können auch wie eine High-Level-Ansatz (ich habe umgesetzt und verpackt wie findtools ):

from findtools.find_files import (find_files, Match)


# Recursively find all *.txt files in **/home/**
txt_files_pattern = Match(filetype='f', name='*.txt')
found_files = find_files(path='/home', match=txt_files_pattern)

for found_file in found_files:
    print found_file

kann mit installiert werden

pip install findtools
import os

dir="/path/to/dir"
[x[0]+"/"+f for x in os.walk(dir) for f in x[2] if f.endswith(".jpg")]

Dies wird Ihnen eine Liste von jpg-Dateien mit ihren vollständigen Pfad. Sie können nur Dateinamen x[0]+"/"+f mit f ersetzen. Sie können auch f.endswith(".jpg") ersetzen mit dem, was Zeichenfolge Bedingung, die Sie wünschen.

Dateinamen mit "jpg" und "png" Erweiterungen in "path / to / images":

import os
accepted_extensions = ["jpg", "png"]
filenames = [fn for fn in os.listdir("path/to/images") if fn.split(".")[-1] in accepted_extensions]

Sie können mit pathlib , die in Python Standard-Bibliothek 3.4 verfügbar ist und oben.

from pathlib import Path

files = [f for f in Path.cwd().iterdir() if f.match("145592*.jpg")]

Sie können subprocess.check_output () als

verwenden
import subprocess

list_files = subprocess.check_output("ls 145992*.jpg", shell=True) 

Natürlich kann die Zeichenfolge zwischen Anführungszeichen gesetzt wird alles, was Sie in der Shell ausgeführt werden sollen, und die Ausgabe speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top