os.path.walk(): Variable als ID hochzählen...

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 21. November 2004, 19:14

Möchte gern eine Variable hochzählen, immer +1 pro Verz und pro Datei...

Ist eigentlich nicht das Thema, aber wie Initialisiere ich die Variable?
Eine Lösung wäre global zu benutzen :(

Bsp:

Code: Alles auswählen

ID=0

def GetData(arg, dirname, FileNameList):
    global ID
    ID += 1
    for FileName in FileNameList:
           ID += 1

os.path.walk( DiscPath, GetData, "")
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Sonntag 21. November 2004, 19:27

Hi!

So geht's auch:

Code: Alles auswählen

ID=0

def GetData(arg, dirname, FileNameList, id=ID):
    print id   # oder was auch immer :D
Gruß, mawe
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 21. November 2004, 19:51

Hi jens,


um Einträge in Verzeichnissen zu zählen würde ich mit os.walk() folgendes machen:

Code: Alles auswählen

def count_entries(dirname):
    num = 0
    for root, dirs, files in os.walk(dirname):
        num += len(files)+len(dirs)
    return num
Mit os.path.walk() könntest Du es so machen:

Code: Alles auswählen

def GetData(arg, dirname, FileNameList):
    arg[0] += 1
    arg[0] += len(FileNameList) # Einfacher als deine Forschleife
    #for FileName in FileNameList:
    #    ID += 1

count = [0] # wichtig eine Liste ist mutable
os.path.walk( DiscPath, GetData, count)
print count[0]
Der Trick ist dabei eine Liste als Argument zu übergeben, der Inhalt einer Liste ist änderbar und so auch innerhalb der Funktion zu ändern.
count bzw. innerhalb der Funktion arg ist quasi der Behälter für den Zähler.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 21. November 2004, 20:20

mawe hat geschrieben:

Code: Alles auswählen

ID=0
def GetData(arg, dirname, FileNameList, id=ID):
    id += 1
    print id   # oder was auch immer :D
Das geht nicht, da ID ja hochgezählt werden soll (innerhalb von getData, deswegen hab ich "id += 1" ergänzt)... Geht aber nicht, weil id immer auf 1 bleibt... Ich denke weil id zwar um eins erhöht wird, aber nicht ID...

Die Version von Dookie geht allerding's... Generell finde ich die os.path.walk() Geschichte etwas merkürdig... Ist nicht so ganz Python-Like, oder???

Cool wäre sowas wie

Code: Alles auswählen

for Verz, DateiListe in os.path.walk("C:").interitems():
    print Verz
    for Datei in DateiListe:
        print Datei
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Sonntag 21. November 2004, 20:25

Hi!
jens hat geschrieben: Ich denke weil id zwar um eins erhöht wird, aber nicht ID
Stimmt. Wusste nicht, daß auch ID verändert werden soll.

Gruß, mawe
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 21. November 2004, 21:19

genau das geht ja mit os.walk()

Code: Alles auswählen

for Verz, VerzList, DateiListe in os.walk("C:\\"):
    print Verz
    for Datei in DateiListe:
        print Datei

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 21. November 2004, 21:22

Dookie hat geschrieben:genau das geht ja mit os.walk()
Verdammt das kenne ich noch garnicht :shock: Und da schlage ich mich immer mit os.path.walk() rum :evil:

EDIT: Zurecht... os.walk() gibt's erst ab Python v2.3 :( Auf dem Server ist aber leider nur Python v2.2.1 :evil:
Antworten