Newbe Frage (hoffentlich)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
may24
User
Beiträge: 27
Registriert: Montag 7. September 2009, 17:14

Hi,

Ich wollte einfach "nur" ein kleines Script schreiben das mir die Anzahl aller xml files in mienem Directory auflistet:

Code: Alles auswählen

#!/usr/bin/python

import sys
import os
import re
import array

FilesInDirAll = []

FilesInDirAll=os.walk("/d/xmlfiles/*.xml")

NumberOfFiles=len(FilesInDirAll)

print NumberOfFiles
Nu bekomme ich ständig:

TypeError: len() of unsized object

kann mir jemand helfen ?

Python: python-2.3.4-14.4.el4_6.1 (64bit)
Linux: RedHat Enterprise release 4 (Nahant Update 6)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

"walk" liefert dir keine Liste zurück, sondern einen Generator (schaue dazu mal in die Dokumentation). Deren Länge kann man im Voraus nicht bestimmen. Wenn es nicht gerade unglaublich viele Dateien sind, dann kannst du einfach ein

Code: Alles auswählen

len(list(FilesInDirAll))
benutzen.

Ich empfehle dir auch gleich noch einen Blick in PEP 8 bezüglich deiner Namen. Es sieht so aus, als hättest du vorher Java benutzt, in Python sind die Namenskonventionen ein wenig anders. So würde man hier nicht "FilesInDirAll" benutzen, sondern "files_in_dir_all". Und am besten gleich einen weniger seltsamen Namen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

may24 hat geschrieben:

Code: Alles auswählen

FilesInDirAll=os.walk("/d/xmlfiles/*.xml")
os.walk() erwartet nur ein echtes Verzeichnis und keine Platzhalter.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Code: Alles auswählen

import glob

filenumber = len(glob.glob('pfad/*.xml'))
?

Ggf. noch mit os.path.join würzen, falls man anderswo suchen möchte. Nur wenn man die Files in Subdirectories ermitteln möchte, braucht es auch eine walk-Funktion.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Stimmt, sonst werden die Listen wohl sehr kurz ^^ Daher empfehle ich als Lösung einfach mal das[mod]glob[/mod]-Modul.

Edit: mod-Tag.
Zuletzt geändert von EyDu am Montag 28. September 2009, 14:54, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
may24
User
Beiträge: 27
Registriert: Montag 7. September 2009, 17:14

@EyDu
... ja, hab vorher Java gemacht. :roll:
Das mit den "unglaublich viele Dateien" ist so 'ne Sache. In diesem Verzeichnis liegen zwischen 30.000 und 50.000 xml Files. Ist das "viel" ?
Leider gibt's da auch ein paar Unterverzeichnisse (zwei) und noch ein paar nicht .xml Dateien.
Ich brauche aber eine Liste da die xml Dateinamen noch "weiterverarbeitet" werden. Das Script soll aber erst mal anzeigen wie viele Dateien zur Verfügung stehen (vor der Filterung...)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn du die Liste eh brauchst, dann verwende CMs Vorschlag, nur dass du das Ergebnis von glob.glob vorher speicherst:

Code: Alles auswählen

spam = glob.glob(...)
print len(spam)

#und hier kannst du sie dann weiterverarbeiten
for element in spam:
    #Verarbeitung von element
Brauchst du die Länge denn im Vorraus? Sonst könntest du auch so etwas machen (beachte das i bei iglob):

Code: Alles auswählen

length = 0
for element in glob.iglob(...):
    #hier kannst du die Datei noch weiterverarbeiten

    length += 1
Das Leben ist wie ein Tennisball.
may24
User
Beiträge: 27
Registriert: Montag 7. September 2009, 17:14

ok, werde ich ausprobieren.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Das wäre ne möglichkeit

Code: Alles auswählen

import sys
import os

file_number = 0
drive = '/was/weis/ich'

for root, dirs, files in os.walk(drive):
    for file in files:
        file_number += 1
the more they change the more they stay the same
Antworten