Eine praktische Übung¶
Ein Verzeichnis enthält einen Satz durchnummerierte Textdateien (Blut.0000
, Blut.0001
, …). Der Inhalt dieser Dateien hat jeweils die gleiche Form: jede Zeile enthält zwei Zahlen, eine Wellenzahl und einen zugehörigen Absorptionswert. Die Wellenzahlen sind in allen Dateien dieselben, und die Dateien haben die gleiche Zeilenanzahl. (Verwenden Sie diesen Beispieldatensatz mit elf Dateien.) Ungefähr so:
3998.76332 0.00110 3927.95115 0.00085 3857.13898 0.00061 3786.32681 0.00048 3715.51464 -0.00012 3644.70247 -0.00397 3573.89029 -0.00014 3503.07812 0.00115 3432.26595 -0.00556 3361.45378 -0.02024 3290.64161 -0.01333 3219.82944 -0.02691 3149.01727 -0.02251 3078.20509 0.00843 3007.39292 0.02401 2936.58075 0.05253 2865.76858 0.03304 2794.95641 0.01666 2724.14424 0.01121 2653.33207 0.00891 2582.51989 0.00670 2511.70772 0.00500 2440.89555 0.00348 2370.08338 0.00269 2299.27121 0.00231 2228.45904 0.00202 2157.64686 0.00155 2086.83469 0.00129 2016.02252 0.00082 1945.21035 0.00070 1874.39818 0.00059 1803.58601 0.00015 1732.77384 0.00104 1661.96166 0.11621 1591.14949 0.08015 1520.33732 0.14534 1449.52515 0.07174 1378.71298 0.06616 1307.90081 0.07216 1237.08864 0.06333 1166.27646 0.05060 1095.46429 0.04957 1024.65212 0.03576 953.83995 0.02671 883.02778 0.02759 812.21561 0.03687
Schreiben Sie ein Skript, das nun alle Absorptionswerte für jede Wellenzahl in eine Datei
data.out
zusammenfasst. Übernehmen sie einmal die Wellenzahlen ebenfalls in die Ausgabedatei, jeweils am Anfang jeder Zeile.Beispielausgabe:
3998.76332 0.00110 0.00098 0.00114 0.00131 0.00131 0.00165 0.00166 0.00153 0.00178 0.00171 0.00174 3998.05520 0.00108 0.00093 0.00123 0.00140 0.00127 0.00157 0.00162 0.00151 0.00166 0.00166 0.00182 3997.34708 0.00104 0.00095 0.00133 0.00143 0.00128 0.00150 0.00160 0.00156 0.00155 0.00161 0.00187 3996.63896 0.00097 0.00101 0.00135 0.00139 0.00137 0.00148 0.00161 0.00161 0.00154 0.00161 0.00188 3995.93084 0.00090 0.00105 0.00130 0.00132 0.00146 0.00149 0.00159 0.00162 0.00160 0.00164 0.00186 3995.22271 0.00088 0.00108 0.00125 0.00128 0.00151 0.00149 0.00155 0.00162 0.00167 0.00169 0.00184 3994.51459 0.00091 0.00113 0.00123 0.00127 0.00150 0.00148 0.00153 0.00162 0.00170 0.00177 0.00183 3993.80647 0.00094 0.00117 0.00124 0.00128 0.00149 0.00147 0.00153 0.00162 0.00169 0.00184 0.00181 3993.09835 0.00090 0.00117 0.00120 0.00125 0.00148 0.00148 0.00151 0.00158 0.00165 0.00186 0.00176 . . . . usw.
Zusätzlich soll die Datei
header.out
einen Tabellenkopf mit den fortlaufenden Dateinummern enthalten. Im Beispiel sieht das so aus:0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010
Bonus: Erweitern sie das Skript um die folgende Funktionalität:
Zusätzlich zu den Datenfiles kann das Verzeichnis eine Datei wellenzahlen.txt enthalten, die definiert, wie die Ausgabedaten gefiltert werden sollen. In jeder Zeile dieser Datei steht ein Wellenzahl-Intervall, etwa so:
3998-4005 804-790 1550-1555 1205-1200
Die Ausgabedatei ihres Skripts soll dann prinzipiell immer noch so aussehen wie oben gezeigt, aber es sollen nur noch diejenigen Zeilen enthalten sein, für die die Wellenzahl (der „linke“ Wert in den Quelldateien) in einem der durch
wellenzahlen.txt
angegebenen Intervalle liegt.
Aufgaben bis zum nächsten Mal¶
Speichern Sie ihre Lösung für die obige Aufgabe unter dem Namen loesung_08_tablejoin_(ihre matrikelnummer).py
in ihrem Pythonanywhere-Account.
Musterlösungen¶
Das Skript combine_minimal_version.py zeigt eine mögliche Lösung ohne Schnörkel. Versuchen Sie, die Programmlogik nachzuvollziehen.
Das Skript combine.py hat etwas mehr Komfort, kann sich z. B. aus einem Verzeichnis die nummerierten Dateinamen selber suchen, wenn der gemeinsame Namensstamm bekannt ist.
Das Skript combine_dict.py löst die gleiche Aufgabe unter Verwendung von Dictionaries.
Das Skript combine_filter.py erledigt zusätzlich die Filterung der Daten nach Wellenzahlen basierend auf der Datei wellenzahlen.txt.