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
Textdatei durchsuchen und Ergebnisse als Datei ausgeben
- 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
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
assert encoding_kapiert
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
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
- 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.
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
assert encoding_kapiert
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!
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!
- 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
assert encoding_kapiert
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.
Danke!
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
Update:
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.
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()
Die Whitespace sind nur zur Trennung der Werte.
Schöner wäre ein Zeilenumbruch gewesen, aber so geht es auch.
- 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:
Damit wird die Datei automatisch *immer* geschlossen.
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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@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):
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()