Mehrere txt-Datein zusammenfassen

  • Liebe Community,

    im Zuge meiner Datenauswertung bin ich an meine Python-Grenzen gestoßen:

    In einem Ordner befinden sich 44 Unterordner die fortlaufend nummeriert sind (scan00, scan01, ..., scan43), diese habe ich in foldernames1 ausgelesen. Jene Ordner beinhalten alle den gleichnamigen Unterordner "diff_values" in welchen jeweils 297 Textdatein sind (Result of scan01_0001, ..., Result of scan01_0297), diese habe ich als "myFiles" ausgelesen. Die Texdatein habe alle jeweils die gleiche Anzahl an Zeilen und Spalten (mittels tab getrennt).

    Nun zu meinem Problem: Das Skript soll nun in jedem Unterordner (beginnend bei scan01/diff_values/ und endend bei scan43/diff_values/) alle txt Datein in eine zusammenfassen. Wobei bei der ersten Datei (z.B. Result of scan_0001) immer die ersten 3 Spalten kopiert werden sollen, und ab der zweiten Textdatei (also von Result of scan01_0002 bis Result of scan01_0297) nur die dritte Spalte kopiert werden soll. In der neuen Textdatei sollen dann alle Spalten nebeneinander (mittels tab getrennt) kopiert werden (damit ich nicht eine lange Wurst an Daten habe und etwas Übersicht bewahren kann). Im Idealfall, beinhalten die neu erstellten Textdatein in der ersten Zeile die Bezeichnungen der jeweiligen Spalten: die erste Spalte "X", die zweite "Y", und dann die Laufvariablen der Textdatein also z.B. 0001 für die Datei Result of scan01_0001 und so weiter (kann auch der ganze Dateinname sein, also z.B. Result of scan01_0001)

    Um mein Problem besser zu beschreiben habe ich zwei Fotos angehängt: ein Foto zeigt ein Beispiel der Textdatein die ein neues File kopiert werden soll, die zweite mein gewünschtes Ergebnis. Ich hoffe, dass ich mein Anliegen klar formulieren konnte.

    Hier ist mein bisheriger Code (es wird zwar eine Textdatei erstellt, diese enthält allerdings dubiose Werte):

    Ich wäre für jede Hilfe äußerst dankbar :)

    Vielen lieben Dank im Voraus und mit den besten Grüßen,

    quester

  • Zur hilfreichsten Antwort springen
  • quester: Ich würde als erstes mal `os` und `glob` durch das `pathlib`-Modul ersetzen. Das hat eine bessere API.

    Dann fehlt in den Zeilen 6 bis 11 ganz offensichtlich Einrückung — das ist syntaktisch falsch und da fällt schon der Compiler drüber bevor das überhaupt läuft.

    Auch wenn das so aussehen mag: Dateinamen werden nicht automatisch sortiert geliefert. Wenn `scan01` wirklich garantiert vor `scan02` kommen soll, musst Du das sortieren.

    Pfadnamen sind keine normalen Zeichenketten die man mit ``+`` zusammenbastelt.

    Benutze kein `os.chdir()`. Das ist globaler Zustand den man nicht ändern sollte. Wenn es da Probleme gibt, operiert das Programm am Ende auf anderen Verzeichnissen als eigentlich angedacht waren, und das skaliert auch, nicht — wenn man anfängt die Funktion an mehr als einer Stelle in der Vearbeitung zu verwenden, kann es Probleme geben.

    `my` ist eine sinnfreie Vorsilbe die in Namen nichts zu suchen hat. Es sei denn es gibt auch `ourFiles` oder `theirFiles` wogegen sich ein `myFiles` sinnvoll abgrenzen würde.

    Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

    Dateien die man öffnet, sollte man auch wieder schliessen. Am besten verwendet man die ``with``-Anweisung um das sicherzustellen.

    Eine beliebige Zahl geöffneter Dateien in einer Liste ist problematisch, weil Betriebssysteme üblicherweise eine Obergrenze mindestens pro Prozess haben, wie viele Dateien gleichzeitig geöffnet sein dürfen. Diese Grenze sollte man nicht ohne Sinn/Not ausloten.

    Keine kryptischen Abkürzungen in Namen. Schreib nicht nur `f` wenn Du `file` meinst und nicht `fout` wenn, ja ich könnte jetzt raten was es genau heissen soll, mir würden da mindestens drei sinnvolle Sachen einfallen, Du könntest das aber auch einfach selbst klar und deutlich schreiben was da gemeint ist.

    Die angesprochenen Bilder sind nicht im Beitrag‽

    Ich würde ganz entschieden den Wunsch alle Dateien *nebeneinander* in die Datei schreiben zu wollen und die laufende Dateinummer, also ein Datum, in die Kopfzeile schreiben zu wollen, in Frage stellen. Das ist nicht übersichtlicher und nicht wirklich sinnvoll weiterverarbeitbar. Also nächstes stellst Du für die Weiterverarbeitung dann nämlich wahrscheinlich die Frage, wie man das in die ”saubere Langform” bekommt. Was man auch gleich machen könnte.

    Edit: Bilder von Text den man auch als *Text* hätte in den Beitrag einfügen können…

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Tut mir leid nicht Deinen Idealen zu entsprechen. Trotzdem vielen Dank für die umfassende Antwort.

    Das Einrücken habe ich tatsächlich beim Kopieren des Codes vergessen, shame on me.

    Das pathlib-Modul habe ich noch nie verwendet, werde ich mir definitiv ansehen.

    D.h. os.chdir könnte ich mittels pathlib-Modul umgehen, sofern ich das richtig verstanden habe? Habe mich bereits etwas eingelesen, mir ist allerdings nicht ganz klar wie ich das in mein Skript impementieren könnte?

    Die Bezeichnungen habe ich teils aus anderen Foren übernommen, wollte damit nicht für Verwirrung sorgen.

    Den Zusammenhang zwischen laufender Dateinummer und Datum sehe ich gerade nicht ganz? Sollte die Beschriftung in der ersten Zeile nicht möglich sein, kann ich sehr gerne darauf verzichten. Bin für jeden praktischen Ansatz sehr dankbar.

    Was ist mit "sauberer Langform" gemeint? Wie mache ich das gleich?

  • quester ”Meine” Ideale klingt so als wären das meine Ideen sauber zu programmieren. Sind es nicht. Es gibt halt Konventionen und etablierte „best practices“. Also sorge Dich nicht um mich, sondern um Deinen Code. ?

    `os.chdir()` kannst und solltest Du auch ohne `pathlib` umgehen. In Deinem Programm arbeitest Du mit Pfaden. ``+`` ist schlicht *falsch*, weil das nicht immer das richtige macht. Vor `pathlib` wäre dafür `os.path.join()` die passende Funktion gewesen. Und statt mit `os.chdir()` den prozessglobalen Zustand ”aktuelles Arbeitsverzeichnis” zu ändern, würde man besser die entsprechenden Pfade zusammensetzen um aus dem Startzustand die entsprechenden Verzeichnisse und Dateien ansprechen zu können.

    Die laufende Dateinummer ist das Datum. Datum = Einzahl von Daten.

    Suchmaschine mit ”tidy data” füttern bringt bei mir eine Menge Suchtreffer. Im Grunde die 3. Normalform wie man sie von relationalen Datenbanken kennt. Grob: Die Spalten enthalten Variablen und die Zeilen die Werte für jeweils eine Messung/Beobachtung.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

    • Hilfreichste Antwort

    So was?

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!