Bestimmte Dateien an Funktion übergeben

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.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Wie kann ich über eine mehrdimensionale Liste iterieren?
deets

Wo kaeme die denn vor? Ich zumindest sehe nix in der Aufgabe, die das erfordert. Und erst Recht nicht in deinem Code bis dato.

Grundsaetzlich iterierst du halt ueber die verschiedenen Dimensionen geschachtelt:

Code: Alles auswählen

for a in liste:
     for b in a:
          ....
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Was ich damit meine:
Ich habe eine Liste, die folgendermaßen aussieht:
list = [liste1, liste2]

hab's grade so probiert:

Code: Alles auswählen

for wert1, wert2 in list:
    print wert1
    print wert2
aber das funktioniert nicht, es kommt die Meldung:

Code: Alles auswählen

ValueError: too many values to unpack
Jemand einen Lösungsvorschlag?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

In [28]: lst
Out[28]: [[3, 4, 5], [6, 7, 8]]

In [29]: for a, b in zip(*lst):
   ....:     print 'a: %d\tb: %s' % (a, b)
   ....: 
a: 3	b: 6
a: 4	b: 7
a: 5	b: 8
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

gibt mir einen 'invalid syntax' zurück...
deets

Dann hast du falschen Code. Aber da du uns nicht zeigst, wie er aussieht, geschweige denn wie genau die Fehlermeldung ist (mit Stacktrace), koennen wir dir auch nicht helfen...
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Code: Alles auswählen

lvm = glob.glob('/users/***/documents/Messungen/*/*.lvm')
verzeichnisse = []
dateinamen = []
for element in lvm:
    verzeichnisse.append(os.path.dirname(element))   # fuegt den Pfad (ohne Dateinamen) zur Liste verzeichnisse hinzu
    head, tail = os.path.split(os.path.dirname(element))  # splittet den Pfad auf, sodass nur der letzte Teil (und damit der Name des Ordners ueber der Datei) gespeichert wird
    dateinamen.append(tail)  # fuegt den letzten Teil (tail) an die Liste dateinamen an

dateinamen2=list(sorted(set(dateinamen)))   # Haut doppelte Datensätze raus und sortiert sie (ist einfach schöner beim debuggen)
verzeichnisse2=list(sorted(set(verzeichnisse)))   # dito.

for ausgabe in verzeichnisse2:
    plot(os.path.join(ausgabe, 'messung 1.lvm'), os.path.join(ausgabe, 'messung2.lvm'), os.path.join(dateinamen2, '.pdf')   #  Syntax für plot() =  plot(Dateiname Messdatei 1, Dateiname Messdatei 2, Ausgabedateiname)
So, die letzte Zeile arbeitet Schritt für Schritt alle Einträge in verzeichnisse2 ab; der Dateiname soll immer dem Ordnernamen entsprechen, in dem die Datei unmittelbar abgelegt ist. Das ist das einzige, was noch nicht funktioniert.
Fällt einem da was ein?
Zuletzt geändert von Anonymous am Dienstag 4. Oktober 2011, 21:24, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Der Code ist zwar alles andere als professionell, ebenso wie die Kommentierung; funktionieren tut er, bis auf die automatische Dateinamenszuweisung...
Kann mir da jemand helfen? Auch Anmerkungen zur Performance sind erwünscht :)

Danke :)
deets

Wer sich Muehe gibt, soll belohnt werden ;)

Deine Implementierung ist zu unflexibel, und arbeitet vom falschen Ende her. Du solltest das Problem lieber so rum angehen:

- wenn ein Verzeichnis gegeben wird, pruefe, ob in dem Verzeichnis die benoetigten Dateien enthaelt, dann prozessiere es
- iteriere ueber alle Verzeichnisse ausgehend von einem Basisverzeichnis, und pruefe fuer jedes, ob es ein "gutes" ist.

Code: Alles auswählen


import os

def tuwas(d):
    print "ich tu mal so als ob ich was tu im verzeichnis", d
    
def verzeichnis_ist_ok(d):
    return all(
        os.path.exists(
            os.path.join(d, "messung %i.lvm" % i)
            )
        for i in xrange(1, 3))


def arbeite(d):
    for root, dirs, files in os.walk(d):
        for dir_ in dirs:
            dir_ = os.path.join(root, dir_)
            if verzeichnis_ist_ok(dir_):
                tuwas(dir_)




def test():
    os.chdir("/tmp")
    if not os.path.exists("ok"):
        os.mkdir("ok")
    for name in ["messung 1.lvm", "messung 2.lvm"]:
        fname = os.path.join("ok", name)
        if not os.path.exists(fname):
            with open(fname, "w") as outf:
                outf.write("test")
    assert verzeichnis_ist_ok("ok")
    if not os.path.exists("nicht_ok"):
        os.mkdir("nicht_ok")
    assert not verzeichnis_ist_ok("nicht_ok")


if __name__ == "__main__":
    test()
    arbeite("/tmp")
BlackJack

@Lateiner: Ohne Syntaxhervorhebung war das unlesbar — mit wird es nur geringfügig besser. Diese unendlich langen Kommantare an den Zeilenenden sind sehr unübersichtlich.

Das erscheint mir das alles ziemlich wirr und wenn das funktioniert, dann wahrscheinlich nur zufällig. Durch das sortieren der Namen und Pfade müsste doch sämtliche Zuordnung dahin sein!? Und für's Plotten nimmst Du feste Dateinamen und versuchst für den PDF-Namen dann eine Liste mit Dateinamen und eine Endung zusammen zu fügen!? Was sollte denn dabei heraus kommen!?
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Also, ich erkläre mal im Folgenden, warum ich das Programm so geschrieben habe wie ich's getan habe:

Ich bekomme als Input von einem Kollegen die Messdaten per Stick oder Mail. Es handelt sich hierbei um ein zip-Archiv, das ungefähr so aussieht:

Code: Alles auswählen

Messung 1
    - messung1.lvm
    - messung2.lvm
Messung 2
...
Messung 1 ist stets eine Kurzbeschreibung des jeweiligen Versuchs. Damit wir nicht den Überblick verlieren, liegt es nahe, dass die ausgegebene pdf auch so heißt wie der Ordner.


Dass die Programmstruktur nicht ganz logisch ist, liegt daran, dass ich einfach 1:1 meine Arbeitsschritte in Programmcode überführt habe - insofern nicht völlig zufällig, aber zum Teil ja :)


@deets: Danke für Deine Mühe :) Probiere es sofort mal aus :)





Danke an alle,
Lateiner


P.S.: Nächstes Mal denke ich an das Syntaxhighlighting ;)
Antworten