Ich bin sehr neu in Python, also entschuldige mich im Voraus, wenn diese Frage zu grundlegend ist.

Ich möchte eine Liste der Unterverzeichnisse eines Pfads lesen und dann ausdrucken. Anstatt die Namen der Unterverzeichnisse zu drucken, werden die Zeichen gedruckt:

products = []
dir_path = "/tmp"
for item in os.listdir(dir_path):
    products.extend(item)
index = 0
for product in products:
    print "%d %s" % ((index+1),product)
    index += 1

Was mache ich hier falsch?

0
fazineroso 9 Dez. 2013 im 21:06

4 Antworten

Beste Antwort

Sie verwenden extend, das eine Iterable verwendet und jedes Element einer Liste hinzufügt, anstelle von append, das nur das Argument hinzufügt, das Sie ihm übergeben. So was:

>>> a = [1,2]
>>> a.extend([3,4])
>>> a
[1, 2, 3, 4]
>>> b = [1,2]
>>> b.append([3,4])
>>> b
[1, 2, [3, 4]]

Eine Zeichenfolge verhält sich wie eine Liste von Zeichen. extend fügt also jedes Zeichen des Elements anstelle des Elements selbst hinzu.

Sie müssen keine Schleife verwenden, um eine Liste zu erstellen, da os.listdir ohnehin eine zurückgibt:

products = os.listdir(dir_path)

Und Sie können die zweite Schleife schreiben, ohne den Index selbst zu erhöhen:

for idx, product in enumerate(products):
    print "%d %s" % ((index+1),product)

Die Funktion enumerate erzeugt ein Objekt, das nur die Paare von (Index, Listenelement) generiert, die Sie benötigen.

2
Peter Westlake 9 Dez. 2013 im 17:20

Sie müssen das Element zu Ihrer Liste hinzufügen.

products.add(item)

extend fügt einer Liste alle Elemente (in Ihrem Fall Zeichen) von iterable (dem Pfad) hinzu.

0
user1251007 9 Dez. 2013 im 17:28

Das erste, worauf ich hinweisen würde, ist

products.extend(item)

Die Methode extends erweitert die Liste, indem alle Elemente in der angegebenen Liste angehängt werden. Da strings iterierbare Objekte sind, fügen Sie einfach alle Zeichen zur Liste hinzu. Ändern Sie die Methode in append

Wenn Sie ein Element und seinen Index in einer Schleife abrufen möchten, verwenden Sie Aufzählung Methode. Verwenden Sie keine Zählervariablen.

for index, item in enumerate(products):
    print "%d %s" % (index, item)

Und der letzte.
os.listdir gibt alle Einträge aus dem angegebenen Verzeichnis zurück. Wenn Sie nur Unterverzeichnisse erhalten möchten

products = (d for d in os.listdir('.') if os.path.isdir(d))
for i, product in enumerate(products):
    print "{0} {1}".format(i, product)
1
Deck 9 Dez. 2013 im 17:26
[(idx, f) for idx, f in enumerate(os.listdir('.'))]

BEARBEITEN (wie von @DSM vorgeschlagen):

list(enumerate(os.listdir('.')))
2
Guy Gavriely 9 Dez. 2013 im 17:24