2009-07-07 5 views

Antwort

12

Verwenden Sie das Modul glob.

>>> import glob 
>>> glob.glob('./[0-9].*') 
['./1.gif', './2.txt'] 
>>> glob.glob('*.gif') 
['1.gif', 'card.gif'] 
>>> glob.glob('?.gif') 
['1.gif'] 
+0

Arbeitete wie ein Charme, danke für diese sehr schnelle Antwort! – JustRegisterMe

2

Die glob Antwort ist einfacher, aber aus Gründen der Vollständigkeit halber: Sie könnten auch os.listdir und einen regulären Ausdruck Prüfung verwenden:

import os 
import re 
dirEntries = os.listdir(path/to/dir) 
for entry in dirEntries: 
    if re.match(".*tmp.*\.log", entry): 
    print entry 
+0

müssen nicht einmal re. – ghostdog74

+0

Gute Idee, das wird besser für kompliziertere Suchen, die mehr als * brauchen. – JustRegisterMe

0

Der Code unten auf früheren Antworten erweitert durch eine zeigt komplizierterer Suchfall.

Ich hatte eine Anwendung, die stark von einer Konfigurationsdatei gesteuert wurde. Tatsächlich gab es viele Versionen der Konfiguration mit jeweils unterschiedlichen Kompromissen. So würde ein Konfigurationssatz zu einer gründlichen Arbeit führen, wäre aber sehr langsam, während ein anderer viel schneller, aber nicht so gründlich usw. wäre. Somit würde die GUI ein Konfigurations-Kombinationsfeld mit Optionen haben, die verschiedenen Konfigurationen entsprechen. Da ich der Meinung bin, dass der Satz von Konfigurationen im Laufe der Zeit wächst, wollte ich die Liste der Dateien und die entsprechenden Optionen (und ihre Reihenfolge) nicht in der Anwendung fest codieren, sondern stattdessen auf eine Dateibenennungskonvention zurückgreifen, die all dies vermitteln würde Information.

Die Namenskonvention, die ich verwendete, war wie folgt. Dateien befinden sich im Verzeichnis $ MY_APP_HOME/dat. Der Dateiname beginnt mit my_config_ gefolgt von der Combo-Indexnummer gefolgt von dem Text für das Combo-Element. Zum Beispiel: Wenn das Verzeichnis (unter anderem) Dateien my_config_11_fast_but_sloppy.txt, my_config_100_balanced.txt, my_config_3_thorough_but_slow.txt enthält, würde mein Kombinationsfeld Optionen haben (in dieser Reihenfolge): Gründlich aber langsam, schnell aber schlampig, ausgeglichen.

Also zur Laufzeit musste ich

  1. meine Konfigurationsdateien im Verzeichnis
  2. Extrahieren Sie eine Liste von Optionen von allen Dateinamen im Kombinationsfeld nach
  3. Sortieroptionen zu setzen, um die Index
  4. der Lage sein, Dateipfad von der gewählten Option

MyConfiguration Klasse unten tut al zu bekommen l die Arbeit in nur wenigen Zeilen Code (deutlich weniger, dass es mich nahm den Zweck :-) zu erklären, und es kann wie folgt verwendet werden:

# populate my_config combobox 
self.my_config = MyConfiguration() 
self.gui.my_config.addItems(self.my_config.get_items()) 

# get selected file path 
index = self.gui.my_config.currentIndex() 
self.config_file = self.my_config.get_file_path_by_index(index); 

Hier ist die MyConfiguration Klasse:

import os, re 

class MyConfiguration: 
    def __init__(self): 
     # determine directory that contains configuration files 
     self.__config_dir = ''; 
     env_name = 'MY_APP_HOME' 
     if env_name in os.environ: 
      self.__config_dir = os.environ[env_name] + '/dat/'; 
     else: 
      raise Exception(env_name + ' environment variable is not set.') 
     # prepare regular expression 
     regex = re.compile("^(?P<file_name>my_config_(?P<index>\d+?)_(?P<desc>.*?)[.]txt?)$",re.MULTILINE) 
     # get the list of all files in the directory 
     file_names = os.listdir(self.__config_dir) 
     # find all files that are our parameters files and parse them into a list of tuples: (file name, index, item_text) 
     self.__items = regex.findall("\n".join(file_names)) 
     # sort by index as an integer 
     self.__items.sort(key=lambda x: int(x[1])) 

    def get_items(self): 
     items = [] 
     for item in self.__items: 
      items.append(self.__format_item_text(item[2])) 
     return items 

    def get_file_path_by_index(self, index): 
     return self.__config_dir + self.__items[index][0] 

    def __format_item_text(self, text): 
     return text.replace("_", " ").title(); 
Verwandte Themen