Hallo zusammen,
ich arbeite gerade an meinem ersten Projekt mit Python.
Ich möchte gerne ein Script schreiben, jedoch weiß ich einfach nicht weiter.
Und zwar soll in meinem Script eine Textdatei eingelesen werden. Diese ist ziemlich lange und soll deshalb zerlegt werden. Und zwar immer, wenn das Wort ,,Stopp'' vorkommt. Dieses ist immer das letzte Wort in einem Absatz und setzt somit die Grenze zum nächsten Absatz.
Hätte jemand eine Idee, wie man das in ein Python-Programm formulieren kann?
Liebe Grüße Napi
Textdatei soll bis zu einem bestimmten Wort laufen
Hallo,
kannst du bitte erklären was mit dem eingelesenen Absatz passieren soll und wieso die Aufteilung sein soll? Man kann durchaus auch längere Textdateien mit Python öffnen und bearbeiten.
Grüße
Dennis
kannst du bitte erklären was mit dem eingelesenen Absatz passieren soll und wieso die Aufteilung sein soll? Man kann durchaus auch längere Textdateien mit Python öffnen und bearbeiten.
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
- __blackjack__
- User
- Beiträge: 14054
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@napi: `re.split()`‽
Edit: Wobei: Ist das ein Trenner oder ein Endkennzeichen?
Edit: Wobei: Ist das ein Trenner oder ein Endkennzeichen?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Hallo Dennis,Dennis89 hat geschrieben: Mittwoch 3. März 2021, 17:11 Hallo,
kannst du bitte erklären was mit dem eingelesenen Absatz passieren soll und wieso die Aufteilung sein soll? Man kann durchaus auch längere Textdateien mit Python öffnen und bearbeiten.
Grüße
Dennis
ich erkläre dir am besten, was genau meine Aufgabe ist, das genannte, ist nur ein Bruchteil der Aufgabe.
Ich habe eine Textdatei, die in viele Teile zerlegt werden soll und jeder Teil endet mit dem Signalwort ,,Stopp''. Nun ist in jedem Teil, dass wir vorher zerlegt haben, eine Nummer und ein Code, die auch mit Nummer: und Code: gekennzeichnet sind (Der Nummer besteht aus Zahlen und der Code aus Zahlen und Buchstaben). Diese sollen gesucht werden und als Resultat ausgegeben werden. In der Aufgabe steht auch, dass diese als Liste mit Tupeln ausgegeben werden sollen und wenn keines der zwei genannten Elemente (in einem zerlegten Stück) auftaucht eine leere Liste erstellt werden soll, bei einem gefundenen Element eine List mit einem wiedergegeben wird und immer so weiter. Am Ende soll sich dann noch die Datei schließen, aber das ist, denke ich mal, das kleinste Problem.
Es wäre echt schön, wenn du eine Idee dazu hast und mir helfen könntest.
Vielen Dank, liebe Grüße,
NaPi
Hi,__blackjack__ hat geschrieben: Mittwoch 3. März 2021, 17:43 @napi: `re.split()`‽
Edit: Wobei: Ist das ein Trenner oder ein Endkennzeichen?
mir wurde nur gesagt, es soll den Text in unterschiedliche Strings unterteilen, denn Rest der Aufgabenstellung findest du in der Antwort an @Dennis, da habe ich das ausführlicher erklärt.
An re.split() habe ich auch schon gedacht, aber ich wusste nicht genau, wie ich das in einen Code formulieren soll.
Liebe Grüße NaPI
Hallo,__deets__ hat geschrieben: Donnerstag 4. März 2021, 08:31 Zeig deinen Code. Und am besten Beispiele des zu verarbeitenden Textes. Mit diesen vagen Hinweisen ist nicht viel anzufangen.
ich wollte nur nicht ins Detail gehen, da ich bei einer Firma lerne und es da Betriebsgeheimnisse gibt.
Code kann ich dir gerne zeigen, aber außer zwei Zeilen habe ich nichts, da ich wie beschrieben keine Programmierkenntnisse haben und die Tutorials, die ich bearbeitet habe, mir in dem Fall auch nicht wirklich weiterhelfen.
Hier, die zwei Zeilen die ich habe:
datei = open('textdatei.txt','r')
datei.close()
Und hier ein Beispiel vom Text:
Code: 3858f8hjsoj9939ufy
Irgendein beliebiger Text blablablablabla
Nummer: 999393949
Stopp
Code: 3ndjdndks934949
Irgendein beliebiger Text blablablablabla
Nummer: 8375930
Nummer: 025839203
Stopp
Code: 9rvjs94nsll49
Irgendein beliebiger Text blablablablabla
Nummer: 020204858
Nummer: 1103948392010
Stopp
Und nun sollen aus jedem zerlegten Stück des Textes bis zum Signalwort ,,Stopp" die Nummer(n) und der Code als Liste mit Tupeln zurückgegeben werden.
Danke und LG NaPi
Wenn das in einer Firma ist, gibt es da niemanden, mit dem du diese Probleme besprechen kannst? Da soll doch eine Ausbildung oder Ähnliches sein?
Das Internet ist voll von Beispielen, wie man eine Datei in Python zeilenweise einliest. Am besten mit dem with Statement. Weil das gleich Sorge trägt, dass die Datei geschlossen wird.
Wenn du dir das erarbeitet hast, kommen wir zum nächsten Schritt.
Das Internet ist voll von Beispielen, wie man eine Datei in Python zeilenweise einliest. Am besten mit dem with Statement. Weil das gleich Sorge trägt, dass die Datei geschlossen wird.
Wenn du dir das erarbeitet hast, kommen wir zum nächsten Schritt.
Ja, da hast du Recht...leider durchs Home Office muss ich sehr lange auf Antworten von Kollegen warten.__deets__ hat geschrieben: Donnerstag 4. März 2021, 09:04 Wenn das in einer Firma ist, gibt es da niemanden, mit dem du diese Probleme besprechen kannst? Da soll doch eine Ausbildung oder Ähnliches sein?
Das Internet ist voll von Beispielen, wie man eine Datei in Python zeilenweise einliest. Am besten mit dem with Statement. Weil das gleich Sorge trägt, dass die Datei geschlossen wird.
Wenn du dir das erarbeitet hast, kommen wir zum nächsten Schritt.
Ich werde auf jeden Fall mich mal mit dem with Statement befassen, danke.
- __blackjack__
- User
- Beiträge: 14054
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@napi: Wenn das "Stopp" immer als einziges in einer Zeile steht, dann ist das ganze ja noch mal deutlich einfacher und braucht dafür kein `re`. Ebenso wenn Nummer und Code immer in eigenen Zeilen stehen. Wobei man da trotzdem einen regulären Ausdruck verwenden kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ja, so wie du das beschrieben hast, ist das richtig. Jedoch weiß ich nicht wie man das programmiert...__blackjack__ hat geschrieben: Donnerstag 4. März 2021, 13:49 @napi: Wenn das "Stopp" immer als einziges in einer Zeile steht, dann ist das ganze ja noch mal deutlich einfacher und braucht dafür kein `re`. Ebenso wenn Nummer und Code immer in eigenen Zeilen stehen. Wobei man da trotzdem einen regulären Ausdruck verwenden kann.
ja, das habe ich bis jetzt und es funktioniert nicht...__deets__ hat geschrieben: Donnerstag 4. März 2021, 14:15 Dann fang an es zu probieren. Wir werden dir keine Lösung aufs Silbertablett packen. DU musst programmieren lernen. Wir können dir nur die Richtung zeigen, du wirst dich schon selbst auf den Weg machen müssen.
with open('textdatei.txt', 'r') as file:
data = file.readlines()[0]
for x in file.read() .split("\n"):
if (x == 'stopp'):
break
print('the number is: ' + data) #keine Liste
data = file.readlines()[-1]
for x in file.read() .split("\n"):
if (x == 'stopp'):
break
print('the code is: ' + data) #keine Liste
Bitte Code in Code-Tags </> posten, damit man die Einrückungen auch sieht.
"Funktioniert nicht" ist eine schlechte Fehlerbeschreibung.
Weißt Du, was jede einzelne Zeile tut?
Es macht wenig sinn, alle Zeilen zu lesen, nur um die erste dann an `data` zu binden.
Zudem ist dann die Datei fertig gelesen, also weitere read oder readlines-Aufrufe liefern nichts mehr.
Was soll in `data` überhaupt drin stehen? `x` ist auch ein nichts-sagender Name; benutze sprechende Variablennamen, an denen man ablesen kann, was der Zweck ist. Wenn Du keinen guten Namen findest, weil der Zweck nicht klar ist, ist es auch schwierig ein funktionierendes Programm zu schreiben.
Daher erstmal ohne Python nur in Worten:
Beschreibe mal, welche Schritte ablaufen müssen, um Dein gewünschtes Ergebnis zu bekommen. Erkläre das mal einem, der nicht selber mitdenkt, sondern nur stur das macht, was Du sagst. Denn genau so arbeiten Computer.
"Funktioniert nicht" ist eine schlechte Fehlerbeschreibung.
Weißt Du, was jede einzelne Zeile tut?
Es macht wenig sinn, alle Zeilen zu lesen, nur um die erste dann an `data` zu binden.
Zudem ist dann die Datei fertig gelesen, also weitere read oder readlines-Aufrufe liefern nichts mehr.
Was soll in `data` überhaupt drin stehen? `x` ist auch ein nichts-sagender Name; benutze sprechende Variablennamen, an denen man ablesen kann, was der Zweck ist. Wenn Du keinen guten Namen findest, weil der Zweck nicht klar ist, ist es auch schwierig ein funktionierendes Programm zu schreiben.
Daher erstmal ohne Python nur in Worten:
Beschreibe mal, welche Schritte ablaufen müssen, um Dein gewünschtes Ergebnis zu bekommen. Erkläre das mal einem, der nicht selber mitdenkt, sondern nur stur das macht, was Du sagst. Denn genau so arbeiten Computer.
- __blackjack__
- User
- Beiträge: 14054
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Es gibt ja so viele praktische (externe) Module.
Angewendet auf die Beispieldaten folgt die Ausgabe:
Code: Alles auswählen
#!/usr/bin/env python3
import regex as re
from more_itertools import split_after
from rich import print
LINE_REGEX = re.compile(
r"((?P<type>Nummer): (?P<value>\d+)|(?P<type>Code): (?P<value>[\da-zA-z]+))\n"
)
def extract_data_from_block(lines):
return [
match.group("type", "value")
for match in map(LINE_REGEX.fullmatch, lines)
if match
]
def main():
with open("test.txt", encoding="ascii") as lines:
result = list(
map(
extract_data_from_block,
split_after(lines, lambda line: line.rstrip() == "Stopp"),
)
)
print(result)
if __name__ == "__main__":
main()
Code: Alles auswählen
[
[('Code', '3858f8hjsoj9939ufy'), ('Nummer', '999393949')],
[
('Code', '3ndjdndks934949'),
('Nummer', '8375930'),
('Nummer', '025839203')
],
[
('Code', '9rvjs94nsll49'),
('Nummer', '020204858'),
('Nummer', '1103948392010')
]
]
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Wow, danke dir! Das hat mir wirklich sehr weitergeholfen!__blackjack__ hat geschrieben: Samstag 6. März 2021, 10:21 Es gibt ja so viele praktische (externe) Module.
Angewendet auf die Beispieldaten folgt die Ausgabe:Code: Alles auswählen
#!/usr/bin/env python3 import regex as re from more_itertools import split_after from rich import print LINE_REGEX = re.compile( r"((?P<type>Nummer): (?P<value>\d+)|(?P<type>Code): (?P<value>[\da-zA-z]+))\n" ) def extract_data_from_block(lines): return [ match.group("type", "value") for match in map(LINE_REGEX.fullmatch, lines) if match ] def main(): with open("test.txt", encoding="ascii") as lines: result = list( map( extract_data_from_block, split_after(lines, lambda line: line.rstrip() == "Stopp"), ) ) print(result) if __name__ == "__main__": main()
Code: Alles auswählen
[ [('Code', '3858f8hjsoj9939ufy'), ('Nummer', '999393949')], [ ('Code', '3ndjdndks934949'), ('Nummer', '8375930'), ('Nummer', '025839203') ], [ ('Code', '9rvjs94nsll49'), ('Nummer', '020204858'), ('Nummer', '1103948392010') ] ]
