Seite 1 von 1
Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Sonntag 22. April 2012, 19:09
von nils
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
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Sonntag 22. April 2012, 19:13
von Hyperion
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

Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Sonntag 22. April 2012, 19:54
von nils
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
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Sonntag 22. April 2012, 20:03
von Hyperion
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.
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Sonntag 22. April 2012, 20:30
von nils
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!
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Sonntag 22. April 2012, 21:35
von Hyperion
Wenn Du das ganze mittels ``csv`` oder ``"".split(" ")`` auftrennen kannst, dann ginge auch dieser Ansatz:
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Dienstag 24. April 2012, 10:31
von nils
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!
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Dienstag 24. April 2012, 11:35
von nils
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.
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Dienstag 24. April 2012, 11:55
von /me
Nur eine ganz kurze Anmerkung (da gleich AFK): Du solltest einen Bezeichner nicht
input nennen, da du damit das eingebaute
input überschreibst.
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Dienstag 24. April 2012, 14:43
von Hyperion
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.
Re: Textdatei durchsuchen und Ergebnisse als Datei ausgeben
Verfasst: Dienstag 24. April 2012, 17:44
von 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()