2016-11-01 5 views
0

Ich verwende Python 3.5, um Daten in CSV-Dateien zu analysieren. Diese Dateien werden in einem "feigen" Verzeichnis enthalten sind, die in einem Fall Verzeichnis enthalten ist, die in einer Gesamtdatenverzeichnis enthalten ist, zB:Python - Navigieren durch Unterverzeichnisse, die Namenskriterien erfüllen

/strm1/serino/DATA/06052009/Feigen

Oder allgemeiner:

/strm1/serino/DATA/case_date_in_MMDDYYYY/Feigen

Das Verzeichnis, in dem ich anfange, ist '/ strm1/serino/DATA /' und jedes Unterverzeichnis ist der Monat, der Tag und das Jahr eines Falles, mit dem ich arbeite. Jedes Unterverzeichnis enthält ein anderes Unterverzeichnis mit dem Namen "figs". Dies ist der Speicherort der CSV-Datei jedes einzelnen Falls. Um genau zu sein:

/strm1/serino/DATA/case_date_in_MMDDYYYY/Feigen/case_date_in_MMDDYYYY .csv

So würde Ich mag in meinem DATA-Verzeichnis starten und gehen durch seine Unterverzeichnisse um diejenigen zu finden, die die MMDDYYYY-Namensgebung haben. Einige der Fallverzeichnisse können jedoch am Ende mit einer Zustandsabkürzung benannt werden, z. B .: '06052009_TX'. Anstatt die MMDDYYYY-Namensgebung exakt zu treffen, könnte es daher einfach sein, zu überprüfen, ob der Verzeichnisname eine Zahl zwischen 1 und 9 enthält.

Sobald ich im ersten Unterverzeichnis (dem Fallverzeichnis) bin, möchte ich verschieben in das Unterverzeichnis "figs". Dort möchte ich auf die CSV-Datei mit der gleichen Namenskonvention zugreifen wie das erste Unterverzeichnis (das Case-Verzeichnis). Ich werde vorhandene Arrays mit den Daten füllen, die in jeder CSV-Datei enthalten sind.

Grundsätzlich betrifft meine Frage das Navigieren durch mehrere Unterverzeichnisse, die einer bestimmten Namenskonvention entsprechen und schließlich auf die Datendatei am "Ende" zugreifen. Ich spielte naiv mit glob, fnmatch, os.listdir und os.walk, aber ich konnte nichts erreichen, was so nah an der Arbeit war, dass ich es für hilfreich halte, sie einzubeziehen. Ich bin mit diesen Modulen nicht sehr vertraut. Was kann ich schließen ist, was ich für gehe:

for dirs in data_dir that contain a number: 
     go into this directory 
     go into 'figs' directory 
     read data from the csv file whose name matches its case directory name (or whose name format matches the case directory name format) 

ich auf ähnliche Fragen gekommen bin, aber ich habe nicht in der Lage gewesen, ihre Antworten in der Art und Weise anzuwenden, die Ich mag würde, vor allem mit verschachtelten Verzeichnissen. Ich schätze die Hilfe sehr, und lassen Sie mich wissen, wenn ich etwas klären muss.

Antwort

0

Die folgenden sollten Sie in Gang bringen. Es verwendet die datetime.strptime() Funktion, um zu versuchen, jeden Ordner-Name in ein gültiges datetime Objekt zu konvertieren. Wenn die Konvertierung fehlschlägt, wissen Sie, dass der Ordnername nicht im richtigen Format ist und übersprungen werden kann. Es versucht dann, jede CSV-Datei zu analysieren, die in dem entsprechenden Ordner gefunden wurde:

from datetime import datetime 
import glob 
import csv 
import os 

dirpath, dirnames, filenames = next(os.walk('/strm1/serino/DATA')) 

for dirname in dirnames: 
    if len(dirname) >= 8: 
     try: 
      dt = datetime.strptime(dirname[:8], '%m%d%Y') 
      print(dt, dirname) 
      csv_folder = os.path.join(dirpath, dirname) 

      for csv_file in glob.glob(os.path.join(csv_folder, 'figs', '*.csv')): 
       with open(csv_file, newline='') as f_input: 
        csv_input = csv.reader(f_input) 

        for row in csv_input: 
         print(row) 

     except ValueError as e: 
      pass 
+0

Das ist genau das, was ich brauchte Hilfe, und es zu sehen, macht Sinn. Ich wusste nicht, dass du 'datetime.strptime' auf diese Weise verwenden kannst. Ich war mir auch nicht bewusst, "versuchen". Vielen Dank, und ich entschuldige mich, dass es dauerte eine Weile, um zu antworten. – ChelleS

0

Sie haben oben einige Probleme aufgelistet. Auf welcher bist du fest? Es scheint, als ob Sie bereits wissen, wie Sie mit os.path durch das Dateispeichersystem navigieren. Sie wissen vielleicht nicht die Funktion os.path.join() die Sie manuell ermöglicht einen Dateipfad in Bezug auf eine Datei als solche angegeben werden:

os.path.abspath(os.path.join(os.path.dirname(__file__), '../..', 'Data/TrailShelters/')) 

Um die oben zu brechen:

os.path.dirname(__file__) gibt den Pfad der aktuellen Datei. '../..' bedeutet: Gehen Sie in der Ordnerhierarchie zwei Ebenen nach oben. Und Data/TrailShelters/ ist das Verzeichnis, zu dem ich navigieren möchte.

Wie trifft das auf Ihren speziellen Fall zu? Nun, Sie müssen einige Anpassungen vornehmen, aber Sie können die os.path des übergeordneten Verzeichnisses in einer Variablen speichern. Dann können Sie im Wesentlichen eine while sub_dir is not null Schleife verwenden, um durch Unterverzeichnisse zu iterieren. Für jedes Unterverzeichnis werden Sie dessen os.path untersuchen und den bestimmten Teil des Pfades, an dem Sie interessiert sind, extrahieren. Dann können Sie einfach folgendes verwenden: if 'TN' in subdirectory_name um festzustellen, ob es ein Unterverzeichnis ist, an dem Sie interessiert sind. Aktualisieren Sie dann das gespeicherte os.path des übergeordneten Verzeichnisses, indem Sie den Pfad an das Unterverzeichnis anhängen. Macht das irgendeinen Sinn?

+0

Vielen Dank für Ihre Antwort. Die folgende Antwort von @Martin Evans geht ausführlicher auf meine Frage ein. Ich entschuldige mich für jede Verwirrung, aber das Navigieren durch die Verzeichnisse war das, woran ich festhielt. Sie haben jedoch Recht damit, dass ich "os.path.join()" nicht kannte und dass ich das in meinem Code verwenden musste. Ich schätze Ihre schnelle Antwort. – ChelleS

Verwandte Themen