2016-05-17 17 views
1

Ich habe dieses kleine Programm erstellt, um 2 Bibliotheken zu simulieren, die ich mit Dateien vergleichen möchte. diesePython Liste Verständnis gibt verschachtelte Liste

Der Code ist:

import os 

path = "C:\Users\\nelson\Desktop\Lib Check" 

pc_path = os.path.join(path, "pc") 
phone_path = os.path.join(path, "phone") 

pc_lib = [filename for path, dirname, filename in os.walk(pc_path)] 

print pc_lib 

es gibt

[['1.txt', '2.txt', '3.txt', '4.txt', '5.txt', '6.txt', '8.txt', '9.txt']] 

alles außer der Tatsache, in Ordnung ist, dass die Ergebnisse in einer verschachtelten Liste enthalten sind. Warum?

Die einzige Art, wie ich dies stoppen kann, ist durch

pc_lib = [] 
for path, dirname, filename in os.walk(pc_path): 
    pc_lib.extend(filename) 
+0

nur für eine weitere Referenz, [ hier] (http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python) ist eine gute Möglichkeit, Listen in Python zu verflachen. – patrick

Antwort

1

Dateinamen verwendet, wird eine Liste von Dateien (der Name, den Sie verwendet haben, ist nicht intuitiv), so werden die Ergebnisse erwartet

for root, dirs, files in os.walk('my/home/directory'): 
    print(files) 
#['close_button.gif', 'close_button_red.gif'], 
#['toolbar.js'] 

extendpackt das Argument list anhängt und die resultierenden Elemente die list, die den Anruf gemacht

1

Wenn Sie eine Liste von Dateinamen möchten, würde ich vorschlagen:

[os.path.join(path, filename) 
for path, dirnames, filenames in os.walk(pc_path) 
for filename in filenames] 
+0

Dies würde einen 'NameError' auslösen:' filenames' ist nicht definiert. 'für Dateinamen in Dateinamen' sollte zuletzt kommen –

0

os.walk(path) gibt einen Iterator über Tupel von (root, dirs, files).

Wo

  • root ist der Pfad des aktuellen Verzeichnisses in Bezug auf das Argument von os.walk
  • dirs ist ein list alle Unterverzeichnisse im aktuellen Verzeichnis
  • files ist ein list alle normalen Dateien im aktuellen Verzeichnis

Wenn Sie eine einfache Liste aller Dateien in einem Dateibaum möchten, verwenden Sie:

pc_lib = [ 
    filename for _, _, files in os.walk(pc_path) 
    for filename in files 
] 

Sie wahrscheinlich den absoluten Pfad beibehalten möchten, erhalten thos verwenden:

pc_lib = [ 
    os.path.join(root, filename) 
    for root, _, files in os.walk(pc_path) 
    for filename in files 
]