Seite 2 von 2
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 18:05
von Lateiner
Wie kann ich über eine mehrdimensionale Liste iterieren?
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 18:27
von 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:
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 18:29
von Lateiner
Was ich damit meine:
Ich habe eine Liste, die folgendermaßen aussieht:
list = [liste1, liste2]
hab's grade so probiert:
aber das funktioniert nicht, es kommt die Meldung:
Jemand einen Lösungsvorschlag?
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 18:54
von derdon
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
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 19:46
von Lateiner
gibt mir einen 'invalid syntax' zurück...
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 19:58
von 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...
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 20:21
von Lateiner
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?
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 20:22
von Lateiner
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

Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 21:27
von 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")
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Dienstag 4. Oktober 2011, 21:35
von 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!?
Re: Bestimmte Dateien an Funktion übergeben
Verfasst: Mittwoch 5. Oktober 2011, 17:14
von Lateiner
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:
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
