2016-06-29 6 views
1

Ich habe die folgende VerzeichnisstrukturWie kann ich vermeiden, bekommen doppelte Pfade von os.walk

/mnt/type/split/v2/doc/RESOURCE_ID/YYYY/FY/DOCUMENT_ID 

zum Beispiel könnte ein Weg

/mnt/type/split/v2/doc/100045/2008/FY/28 

wo

RESOURCE_ID = 100045 
YYYY = 2008 
DOCUMENT_ID = 28 

Hinweis sein DOCUMENT_ID ist das letzte Verzeichnis im Pfad - Dateien im Verzeichnis DOCUMENT_ID

ich versuche Inventar dieser Struktur zu nehmen mit dem folgenden Code

def survey(): 
    magic_paths = [] 
    for (resource_id, dirname,filename) in os.walk('/mnt/type/split/v2/doc'): 
     if resource_id: 
      for (magic_path, dirname2,filename2) in os.walk(resource_id): 
       if len(magic_path.split(os.sep)) == 10: 
         magic_paths.append(magic_path + os.linesep) 
    write_survey(magic_paths) 
    x = len(magic_paths) 
    return x 

Ich erhalte fünf Kopien jeden Pfad in meiner magic_paths Liste. Ich habe 1.500.000 Pfade, also bekomme ich 7.500,00 Einträge in meiner Liste.

Die ersten 1.500.000 sind die einzigartigen Werte. Die nächsten 6.000.000 von Gruppen bestehen, die auf dem RESOURCE_ID verwurzelt sind, 4-mal wiederholt

/mnt/type/split/v2/doc/100045/2008/FY/28 #obs_1 
/mnt/type/split/v2/doc/100045/2008/FY/29 #obs_2 
/mnt/type/split/v2/doc/100045/2008/FY/30 #obs_3 
/mnt/type/split/v2/doc/100045/2008/FY/31 #obs_4 
/mnt/type/split/v2/doc/1028/2008/FY/28 #obs_5 # see the new RESOURCE_ID 
. 
. 1,499,995 more unique values 
. 
/mnt/type/split/v2/doc/100045/2008/FY/28 #begin of first repetition 
/mnt/type/split/v2/doc/100045/2008/FY/29 
/mnt/type/split/v2/doc/100045/2008/FY/30 
/mnt/type/split/v2/doc/100045/2008/FY/31 
/mnt/type/split/v2/doc/100045/2008/FY/28 #begin of second repetition 
/mnt/type/split/v2/doc/100045/2008/FY/29 
/mnt/type/split/v2/doc/100045/2008/FY/30 
/mnt/type/split/v2/doc/100045/2008/FY/31 
/mnt/type/split/v2/doc/100045/2008/FY/28 #begin of third repetition 
/mnt/type/split/v2/doc/100045/2008/FY/29 
/mnt/type/split/v2/doc/100045/2008/FY/30 
/mnt/type/split/v2/doc/100045/2008/FY/31 
/mnt/type/split/v2/doc/100045/2008/FY/28 #begin of fourth repetition 
/mnt/type/split/v2/doc/100045/2008/FY/29 
/mnt/type/split/v2/doc/100045/2008/FY/30 
/mnt/type/split/v2/doc/100045/2008/FY/31 
/mnt/type/split/v2/doc/1028/2008/FY/28  #series of 4 repetitions based on RESOURCE ID 1028 

Es gibt verschiedene Dateien in den Verzeichnissen und U-Booten auf jeder Ebene, ich brauche nur zu inventarisieren der Pfade zu dem DOCUMENT_IDs.

Ich verstehe nicht, warum die Ergebnisse so strukturiert sind wie sie sind. Ich glaubte, dass ich bei RESOURCE_ID anfing und nur die Verzeichnisse fand, die 9 tief waren, seit das Teilen auf os.sep mir eine Liste mit zehn Einzelteilen gibt.

'/mnt/type/split/v2/doc/100045/2008/FY/31'.split(os.sep) = ['','mnt',type','split','v2','doc','100045','2008','FY','31'] 

Als Antwort auf die Fragen in den Kommentaren

  1. Ich glaube, dass ich jedes RESOURCE_ID Verzeichnis wurde immer und es dann zu Fuß. Dass die anderen Elemente aus dem ersten os.walk zurück (dirnames und Dateinamen) ignoriert werden würde
  2. ich nicht glaubte, os.listdir funktionieren würde, kann ich diese Arbeit mit glob machen, aber mach mir Sorgen um es zu essen mein Gedächtnis
+1

Warum sind Sie jedes Verzeichnis zu Fuß zweimal * *? Sie rufen 'walk()' erneut auf. –

+1

Verstehen Sie einen Unterschied zwischen "os.listdir" und "os.walk"? Der Zweite rekuriert für dich.Nested 'Walk()' Anrufe sieht sehr verdächtig aus. –

+0

Geben Sie auch den tatsächlichen Code ein; Der von Ihnen gepostete Code ist nicht gültig Python; Der Pfad ist keine Zeichenfolge in Anführungszeichen. Bei Fehlern wie diesem ist es schwierig herauszufinden, welche anderen Fehler Sie in Ihren Post eingefügt haben, die nicht in Ihrem echten Code enthalten sind. Ich gehe davon aus, dass "os.walk()" und "walk()" dieselbe Funktion haben, aber nicht sicher sein können. –

Antwort

1

os.walk() wird rekursiv gehen Sie eine Verzeichnisstruktur. Für jedes gefundene Verzeichnis starten Sie einen weiteren rekursiven Aufruf. Für jedes Verzeichnis gehen Sie dieses Verzeichnis und alle verschachtelten Verzeichnisse rekursiv durch. Das schließt verschachtelte Verzeichnisse ein. Wenn Sie eine Suche nach , /mnt/type/split/v2/doc/100045, /mnt/type/split/v2/doc/100045/2008, /mnt/type/split/v2/doc/100045/2008 und /mnt/type/split/v2/doc/100045/2008/FY Pfaden starten, produzieren Sie 5 Übereinstimmungen pro Dokument-ID.

Anruf os.walk() nur einmal:

def survey(): 
    magic_paths = [] 
    for (resource_id, dirnames, filenames) in os.walk('/mnt/type/split/v2/doc'): 
     if len(resource_id.split(os.sep)) == 10: 
       magic_paths.append(resource_id + os.linesep) 
    write_survey(magic_paths) 
    x = len(magic_paths) 
    return x 

Sie möchten die Suche beschneiden, nachdem eine Übereinstimmung zu finden; gibt es keinen Punkt durch weitere Unterverzeichnisse in der Suche, wenn Sie ein DOCUMENT_ID Verzeichnis:

def survey(): 
    magic_paths = [] 
    for (resource_id, dirnames, filenames) in os.walk('/mnt/type/split/v2/doc'): 
     if len(resource_id.split(os.sep)) == 10: 
       magic_paths.append(resource_id + os.linesep) 
       dirnames[:] = [] # clear the subdirs list to stop further recursion here 
    write_survey(magic_paths) 
    x = len(magic_paths) 
    return x 
+0

Sie sagen, dass, wenn es ein Resource_id-Verzeichnis wirft, das dann automatisch gelaufen wird - verzeihen Sie meine Sprache, damit alle YYYY-Verzeichnisse dann gegangen werden. . . das hilft mir zu verstehen, warum Wildcards nicht in os.walk eingebaut sind - sie werden nicht benötigt, stattdessen testet man die Ausgabe – PyNEwbie

+0

@MartijinPieters - kann man das bearbeiten, um zu erklären, warum ich genau die 4 Dupes in dieser bestimmten Reihenfolge hatte? – PyNEwbie

+1

@PyNEwbie: 'os.walk()' führt zuerst die Baumtiefe durch und es hängt davon ab, wie tief dein Baum ist, wie oft du einen anderen 'os.walk()' für ein gegebenes Elternverzeichnis startest, das zum selben verschachtelten führt Unterverzeichnis. Aber da es 4 Verschachtelungsebenen gibt, würden Sie 'os.walk()' für jedes der 4 übergeordneten Verzeichnisse für jede Übereinstimmung ausführen. –

Verwandte Themen