Reihenfolge bei Verarbeitung festlegen

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
doc-grins
User
Beiträge: 5
Registriert: Montag 6. April 2009, 12:08

Hallo!


Wow, mein erster post in diesem Forum, hoffe, daß ich hier auch als python-Anfänger viele Fragen stellen darf! :D

Vielleicht kurz der Hintergrund zu meiner Frage: habe vor kurzem mit meiner Diplomarbeit in Chemie angefangen und muß unter anderem auch theoretische Berechungen an Festkörpern mit Gaussian durchführen (zuerst am isolierten Molekül, später dann im kristallinen Zustand) und die Qualität bestimmter Methoden für bestimmte Rechenarten vergleichen (auf gut Deutsch: welcher Rechenmurks paßt am besten zum echten Wert :wink: ).

Gaussian gibt dabei als Ergebnis sogenannte log-files aus, in denen bestimmte Zahlen später tabelliert werden müssen. Habe mal als Beispiel eines dieser log-files für das Molekül Wasser bei paste.pocoo.org hochgeladen (Paste #111310).

Dafür habe ich ein kleines Programm geschrieben (auch auf paste.pocoo.org, Paste #Paste #111312, samt allen Kommentaren...), welches diese log-files dann nach den entsprechenden Werten durchsucht und die tabellarisch und fertig für LaTEX formatiert in ein Textfile schreibt. Bitte nicht auslachen, das waren meine ersten blutigen Schritte mit Python, wenn jemand Verbesserungsvorschläge für den Quellcode hat, bin ich aber für alles zu haben :oops:

Meine Frage ist jetzt: wie kann ich dem Programm mitteilen, in welcher Reihenfolge es alle im Verzeichnis vorhandenen log-files auswerten und auflisten soll? Müssen die Namen der files direkt in das Programm in der richtigen Reihenfolge geschrieben werden? Leider habe ich dazu gar keine Idee.

Vielleicht kann mir da jemand helfen? :D


Später werde ich sicher nochmal Hilfe brauchen, da für den Vergleich mit experimentellen Daten cif-files ausgelesen werden sollen. Dafür braucht man ein Modul – PyCIFRW –, für das es hier im Forum bisher nur einen Treffer gibt (http://www.python-forum.de/topic-15750. ... ht=pycifrw), der thread von damals scheint aber im Sand verlaufen zu sein... :?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

doc-grins hat geschrieben:Meine Frage ist jetzt: wie kann ich dem Programm mitteilen, in welcher Reihenfolge es alle im Verzeichnis vorhandenen log-files auswerten und auflisten soll? Müssen die Namen der files direkt in das Programm in der richtigen Reihenfolge geschrieben werden? Leider habe ich dazu gar keine Idee.
Das hängt davon ab, ob sich im Dateiname oder sonstwo im log-File eine Information darüber findet, die etwas über die gewünschte Reihenfolge der Verarbeitung aussagt. Falls die log-Files z.B. Dateinamen haben, die über das Datum der Erzeugung generiert wurden oder aber auch wenn die log-Files in der gleichen (oder umgekehrten) Reihenfolge ausgewertet werden sollen, wie sie entstanden bzw. zuletzt bearbeitet wurden, dann lässt sich das automatisieren.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo und willkommen im Forum,

also bei dem Logfile habe ich erst einmal gedacht: Oh, Sch.... - was ist das denn für ein Format? Kann das Programm seine Daten auch etwas strukturierter ausspucken?

Über das Einlesen der Daten möchte ich erst mal nichts sagen: Ein schlechtes Datenformat verlangt manchmal seltsame Verrenkungen. Aber zum restlichen Code:

- Das Encoding-Cookie sagt dem Interpreter in welchem Encoding die Datei gespeichert ist. Das müßtest Du ensprechend anpassen.
- Wenn Du "raw" Strings nutzt, wirst Du die Backslashplage los. Ein Beispiel:

Code: Alles auswählen

#entweder
r"\textbf{test}"
# oder
"\\textbf{test}"
- Generell würde ich das Lesen und das Schreiben der Daten in separate Funktionen packen, damit der Code leichter zu pflegen ist. Dazu vielleicht das Tutorial lesen? Dann wird Dir auch klar, wie man dieses Logfile auch etwas einfacher behandeln kann.

Zum Thema CIF und Python: Openbabel scheint das Format auch zu unterstützen. Dafür gibt es auch eine Pythonanbindung - habe ich selber aber nicht getestet.

HTH
Christian
doc-grins
User
Beiträge: 5
Registriert: Montag 6. April 2009, 12:08

@numerix:

das Problem ist eigentlich ganz banal und hängt nur damit zusammen, daß einige Rechungen bei kleineren Strukturen schneller fertig werden und wurden als bei anderen, größeren Molekül-Brummern, deswegen kann man das Datum der files vermutlich leider nicht als Sortierkriterium verwenden.

Für die Tabellen wäre es also gut, wenn man die Reihenfolge, in der die files z.B. anhand des File-Namens festlegen könnte, also konkreter:

ich habe einige log-files (z.B. A.log, B.log, C.log, D.log, usw.), die in der Tabelle dann z.B. in der Reihenfolge B.log, C.-log, A.log, D.log, usw. von oben nach unten aufgelistet werden sollen.

Bisher konnte ich da aber keine rechte Systematik erkennen, wenn man mehrere files gleichzeitig an das Programm verfüttert hat. Oder kann man die Steuerung der Reihenfolge gar nicht über die Namen der Dateien festlegen?


@CM: ich gelobe schon jetzt mal Besserung wg. Übersichtlichkeit & co.! :lol:

Auf die PyCIFRW-Sache komme ich später nochmal zurück, da das erst der zweite Schritt in der Dipl-Arbeit ist (und da habe ich hoffentlich noch ein paar Wochen Zeit...)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

doc-grins hat geschrieben:Oder kann man die Steuerung der Reihenfolge gar nicht über die Namen der Dateien festlegen?
Doch sicher. Das ist nicht das Problem. Das Problem ist das, was du als "keine Systematik" erkannt beschreibst.
Es muss doch irgend ein Kriterium geben, das die von dir gewünschte Reihenfolge der Verarbeitung festlegt. Welches ist das denn?

Wenn es mit der Größe der Datenmenge zu tun hat, gibt es ja vielleicht einen Zusammenhang zur Dateigröße. Die lässt sich über ein Python-Skript ebenfalls abfragen, so dass z.B. die log-Files nach ihrer Größe geordnet verarbeitet werden könnten.
doc-grins
User
Beiträge: 5
Registriert: Montag 6. April 2009, 12:08

Ah..jetzt!


Die nicht-erkannte Systematik stammt daher, daß ich in einigen Testläufen (ob das Skript überhaupt etwas mit mehreren log-files anfangen kann) dem Programm eine Anzahl willkürlicher log-files zur Verarbeitung angeboten habe.

Das Skript lief auch durch und setzte die entsprechenden Zeilen in das Textfile. Ehrlich gesagt habe ich zunächst vermutet, daß die log-files in der alphabetischen Reihenfolge ihres File-Namens aufgerufen werden.

Die gewünschte Reihenfolge, in der die Files dann in der Tabelle stehen sollen, hängt von den hinter diesen Rechnungen stehenden Verbindungen ab (z.B. wurden zunächst kleinere organische Moleküle berechnet, dann größere Steroid-Bruchstücke, etc.).

In der Tabelle soll dabei der chemisch sinnvolle Weg "vom einfachen zum komplexen Molekül" aufgezeigt werden, der aber leider weder mit der Dateigröße noch dem Bearbeitungsdatum zusammenhängt.
Letztere Punkte werden nur durch die Zahl der Konvergenzzyklen des Gaussian-Programms beeinflußt und können für kleinere Moleküle rasch die größerer Moleküle übersteigen.

Im Endeffekt steckt dahinter also auch der Wunsch, daß - falls später nochmal ein "Zwischen-Molekül" berechnet werden muß - dieses dann auch in die Tablle kann.
doc-grins
User
Beiträge: 5
Registriert: Montag 6. April 2009, 12:08

...quasi im Schlaf eingefallen:


Könnte man so eine Art command-file schreiben (als Text-File), welches die richtige Reihenfolge vorgibt? Also so eine Art Auflistung der Namen der log-files à la:

Verbindung_A.log
Verbindung_XY.log
Verbindung_HM.log
Verbindung_B.log
Verbindung_Z.log
Verbindung_C.log
usw.

Aber wie verknüpft man dann sowas mit dem eigentlichen Programm?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

doc-grins hat geschrieben:Könnte man so eine Art command-file schreiben (als Text-File), welches die richtige Reihenfolge vorgibt?
Genau das hätte ich Dir jetzt vorschlagen wollen, wenn die Namensgebung selbst keine korrekte Bearbeitungsreihenfolge erlaubt.
Als erstes liest Du die Textdatei mit den Log-Dateinamen in eine Liste ein und bearbeitest diese oder machst das ganze zeilenweise:

Code: Alles auswählen

# Pseudocode:
with indexfile:
    for filename in indexfile:
        process(filename)
Ggf. rufst Du in process(filename) dann das eigentliche Auswertungsprogramm als subprocess mit dem Dateinamen als Parameter auf.
Zuletzt geändert von kbr am Dienstag 7. April 2009, 08:41, insgesamt 1-mal geändert.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Spontan würde mir da eine Liste zu einfallen. Geht aber auch mit Datei:

Falls du unter Linux arbeitest, kannst du deine Dateiname auch in eine Textdatei schreiben

Textfiles

Code: Alles auswählen

file1
file2
file3
file4
und dann über die Kommandozeile diese datei an dein skript übergeben

Code: Alles auswählen

cat list.txt | ./shell.py

Code: Alles auswählen

#!/usr/bin/python
import sys

for file in sys.stdin.readlines():
	print file.strip()
doc-grins
User
Beiträge: 5
Registriert: Montag 6. April 2009, 12:08

schonmal vielen dank für die schnelle hilfe!


werde das im laufe des nachmittags ausprobieren, muß jetzt fix wegen einer besprechung weg



bis später
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Code: Alles auswählen

cat list.txt | ./shell.py
Kann man effizienter mit "<" machen:

Code: Alles auswählen

./shell.py < list.txt
lunar

@fabron
Dafür wäre das "fileinput"-Modul einen Blick wert ;)
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

In dem Zusammenhang ist mir das fileinput Modul auch schon einmal untergekommen, aber ich habe es selber noch nicht verwendet. Deshalb -> keine Ahnung davon :D
Und wenn man keine Ahnung hat, halte ich es mit Dieter Nuhr ;)

Ich hätte wenigstens noch einen Hinweis darauf schreiben können ... aber hier geht ja nix unter ;)

Code: Alles auswählen

./shell.py < list.txt
versuche ich mir schon seit Jahren erfolglos zu merken, 'cat' tippe ich irgendwie immer automatisch :D
Antworten