Wie der Titel sagt, ich benutze Linux, und der Ordner könnte mehr als eine Datei enthalten, ich möchte die eine seinen Namen enthalten *tmp*.log
(*
bedeutet natürlich alles!). Genau wie bei der Verwendung der Linux-Befehlszeile.Durchsuchen Sie einen Ordner nach Dateien wie "/*tmp*.log" in Python
Antwort
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']
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
müssen nicht einmal re. – ghostdog74
Gute Idee, das wird besser für kompliziertere Suchen, die mehr als * brauchen. – JustRegisterMe
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
- meine Konfigurationsdateien im Verzeichnis
- Extrahieren Sie eine Liste von Optionen von allen Dateinamen im Kombinationsfeld nach
- Sortieroptionen zu setzen, um die Index
- 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();
Arbeitete wie ein Charme, danke für diese sehr schnelle Antwort! – JustRegisterMe