Textdatei durchsuchen und Ergebnisse als Datei ausgeben

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
nils
User
Beiträge: 5
Registriert: Sonntag 22. April 2012, 18:45

Guten Tag,

ich habe eine Programmieraufgabe die mir bislang Probleme bereitet, da ich keinen Ansatz mit passenden Statements finde.
Folgendes Problem liegt vor:

Aus einer Textdatei bestehend sowohl aus Zahlen und Buchstaben würde ich gern bestimmte für mich interessante Werte separieren.
Meine Idee wäre nach einem bestimmten string oder slice, also einem Signalwort zu suchen und die darauf folgenden Einträge auszulesen und als Liste auszugeben.

Zusammenfassend also:
Datei einlesen, durchsuchen und Suchergebnisse in neuer Datei abspeichern.

Ich hoffe ihr könnt mir weiterhelfen. MfG,


Nils
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo und Willkommen um Forum!

Deine "Fragen" sind ja sehr allgemein gehalten... ich fürchte außer einem Hinweis auf das ``re``-Modul kann man Dir nicht viel raten.

Für mehr Tipps, brauchen wir mehr Infos, etwa den Aufbau der Datendatei, welche Daten Du da rausziehen willst (Regeln!) und ggf. was mit den Daten weiter passieren soll (zwecks passender Struktur / Datenformat). Gerne alles auch mit Beispielen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nils
User
Beiträge: 5
Registriert: Sonntag 22. April 2012, 18:45

Vielen Dank für die schnelle Antwort!

Es handelt sich um ein Resultsfile das folgendermaßen aufgebaut ist:

...a=... b=... c=... d=... e=... f=...

Der Text wiederholt sich, aber zur weiteren Datenverarbeitung sind für mich nur die bestimmte Werte interessant.

Meine Idee wäre es nach "c=" zu suchen und dann die nächsten x Einträge, Beispielsweise "1.0E-3", in diesen Fall also 6 Einträge in einer neuen Datei zu speichern

Danke
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bitte setze Code (und solche Datendateibeispiele sind auch "Code" ;-) ) in die Code-Tags: [ code ]Dein Code[/ code ] (ohne die Leerzeichen).

Bist Du Dir denn sicher, dass die Länge immer 6 Zeichen sind? Ich denke wirklich hierfür bietet sich ein RegExp an! Wenn Du damit noch nicht vertraut bist, dann lies Dir einfach die Doku oder das dort verlinkte Tutorial durch und experimentiere ein wenig in einer Python-Shell (indem Du z.B. mal eine Zeile als String dort ablegst ;-) )

Wenn zwischen den Dateneinträgen Leerzeichen oder immer gleiche Trennzeichen stehen, kannst Du das später auch noch mittels ``csv``-Modul parsen.

Für die Dateneinträge an sich bietet sich aber ein RegExp an.

Zeig doch ruhig mal ein paar Zeilen davon. Evtl. sind die Daten ja auch so homogen, dass man tatsächlich mit simplen String-Methoden arbeiten kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nils
User
Beiträge: 5
Registriert: Sonntag 22. April 2012, 18:45

Glücklicherweise ist die Länge konstant Das macht es ein wenig einfacher.
Ich danke schonmal für den ersten Tip. Wusste nicht wo ich ansetzen sollte.
Für die Abendlektüre ist also gesorgt, hoffe das das reicht. Nochmals Danke!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wenn Du das ganze mittels ``csv`` oder ``"".split(" ")`` auftrennen kannst, dann ginge auch dieser Ansatz:

Code: Alles auswählen

key, value = item.strip().split("=")
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nils
User
Beiträge: 5
Registriert: Sonntag 22. April 2012, 18:45

Ich bin die Sache mal ganz pragmatisch angegangen und habe mich auf die basics beschränkt:
Als Text musste ein Auszug aus einem Artikel herhalten, den ich spontan zum testen gewählt habe.
Soweit läut der Algorithmus schon, nur weis ich nicht wie ich meine Ausgabe/Ergebnisse in das .dat-File bekomme.

Code: Alles auswählen


input = open ('...\python\Text.dat','r')
output = open ('...\python\Ergebnisse.dat','w')
x = input.read()

def neu():
    i = 0
    while i < len(x):
        word = x[i:i+8]
        if word == 'Lierhaus':
            string= x[i+9:i+15]
            print string
        i += 1

Danke!
nils
User
Beiträge: 5
Registriert: Sonntag 22. April 2012, 18:45

Update:

Code: Alles auswählen

input = open ('C:\Users\Nils\Documents\python\Eprint.dat','r')
output = open ('C:\Users\Nils\Documents\python\Ergebnisse.dat','w')
x = input.read()
whitespace = ' '

def neu():
    i = 0
    while i < len(x):
        word = x[i:i+6]
        if word == 'Step =':
            string= x[i+8:i+19]
            print string
            output.write(string)
            output.write(whitespace)
        i += 1
    input.close()
    output.close()

Habe es, wenn auch etwas hölzern, bereits gelöst.
Die Whitespace sind nur zur Trennung der Werte.
Schöner wäre ein Zeilenumbruch gewesen, aber so geht es auch.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Nur eine ganz kurze Anmerkung (da gleich AFK): Du solltest einen Bezeichner nicht input nennen, da du damit das eingebaute input überschreibst.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Poste uns doch mal einen kleinen Auszug aus Deiner Datei (so vier fünf Zeilen). Ohne das Format zu kennen, kann man schwerlich einen sinnvollen Vorschlag machen.

Für Python-Code benutze die speziellen Python-Code-Tags: [ code=python ] [ /code]

Dateien solltest Du immer so öffnen:

Code: Alles auswählen

with open(...) as handler:
    # in diesem Block ist handler ein offenes File-Objekt.
Damit wird die Datei automatisch *immer* geschlossen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@nils: Aus so einer ``while``-Schleife sollte man eine ``for``-Schleife machen. Das spart Code und macht das ganze etwas übersichtlicher.

Letztendlich kann man sich die umständliche Schleife mit dem nicht gerade effizienten Inhalt aber auch sparen. Entweder, in dem man mal schaut was Zeichenketten so für Methoden bieten — erstaunlicherweise gibt da schon welche um Zeichenketten in anderen zu suchen. Oder, in dem man `re.findall()` verwendet. Was hier wohl der kompakteste und einfachste Weg zu sein scheint.

Edit (ungetestet):

Code: Alles auswählen

import os
import re


def main():
    path = r'C:\Users\Nils\Documents\python'
    
    with open(os.path.join(path, 'Eprint.dat'), 'r') as in_file:
        data = in_file.read()

    with open(os.path.join(path, 'Ergebnisse.dat'), 'w') as result_file:
        result_file.writelines(
            step_value + ' '
            for step_value in re.findall(r'Step = (.{11})', data)
        )


if __name__ == '__main__':
    main()
Antworten