Textdatei einlesen und bearbeiten

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.
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

Moin,
ich muss eine Textdatei einlesen und bearbeiten, z.b muss ich an jede Stelle wo in i steht eine 1 einsetzten fürs i. Wie kann ich sowas am besten machen?
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mois: Naja, den Inhalt einlesen, und dann die "i" durch "1" ersetzen. Und eventuell den neuen Inhalt wieder in die Datei schreiben, falls das zur Aufgabe gehört.

Lesen und schreiben des kompletten Inhalts als Zeichenkette geht sehr einfach mit Methoden auf `pathlib.Path`-Objekten und ersetzen von einer Teilzeichenkette durch eine andere kann man mit einer Methode auf Zeichenketten. Falls die in den Unterlagen mit denen Du die Grundlagen lernst, nicht vorkommen sollte, schau Dir mal an was für Methoden Zeichenketten so bieten.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

die datei habe ich schon mit open geöffnet das problem was ich hab ist beim ersetzen der einzelnen buchstaben durch zahlen
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeig doch den Code und die genaue Fehlermeldung.
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

meine Idee war es die gesamte datei in ein Array zu packen und dann die Textdatei zu durlaufen und mit einer if bedingung zu prüfen ob der buchstabe der richtige ist

def einlesen():

Wörterbuch= open("rfc4960.txt", "r")

for Zeile in Wörterbuch:
zeile = Wörerbuch.readlines

soweit bin ich weiter weiß ich nicht also wie genau muss ich das mit dem ersetzen machen?
Zuletzt geändert von mois am Mittwoch 28. Oktober 2020, 13:41, insgesamt 1-mal geändert.
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

es klappt einfach nicht das ist m ein problem
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mois: „Es klappt einfach nicht“ ist keine ausreichende Fehlerbeschreibung. Was genau klappt nicht? An welcher Stelle verhält sich das Programm nicht so wie Du das erwartest? Was erwartest Du, was passiert stattdessen? Gibt es eine Fehlermeldung? Falls ja welche? Komplett mit Traceback 1:1 in den Beitrag kopiert. Und Du müsstest hier ja eine Ausnahme bekommen, falls der Code tatsächlich so ausgeführt und die Funktion aufgerufen wird. Gross-/Kleinschreibung ist relevant bei Namen in Python. `Name` ist was anderes als `name` ist was anderes als `nAmE`. Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Also `wörterbuch` statt `Wörterbuch`.

Warum nennst Du eine Datei die den Text von "rfc4960.txt" enthält (nehme ich jetzt einfach mal an) ausgerechnet `wörterbuch`? Ein Dateiobjekt ist kein Wörterbuch und inhaltlich geht es in dem RFC auch nicht um Wörterbücher. Zudem ist ein Wörterbuch (`dict`) ein Grunddatentyp in Python, und die haben in der Regel sowieso nichts in Namen zu suchen.

Dateien öffnet man am besten zusammen mit der ``with``-Anweisung, damit sie sicher wieder geschlossen werden wenn der ``with``-Block verlassen wird — egal aus welchem Grund. Zudem sollte man bei Textdateien am besten immer explizit die Kodierung angeben.

Wenn man eine Datei zum schreiben öffnet, wird als erstes nach dem öffnen der Inhalt gelöscht. Die gleiche Datei parallel dazu zum lesen zu öffnen macht also wenig Sinn, weil die leer ist. Du musst erst die Datei komplett in den Speicher lesen, bevor Du sie zum schreiben öffnest. Oder mit einer temporären Datei arbeiten, also aus einer Datei lesen und in eine andere Schreiben und am Ende die geschriebene Datei in die gelesene umbenennen.

Wo hast Du den Begriff ”Array” her und warum ist da ein Semikolon am Ende einer Zeile? Kann es sein, dass Du versuchst Wissen aus einer anderen Programmiersprache auf Python zu übertragen ohne die Python-Grundlagen durchzuarbeiten? Arrays sind etwas anderes als Listen.

`list` ist der eingebaute Datentyp für Listen. Auf den kann man nicht mit eckigen Klammern auch Elemente zugreifen. Das kann man bei Exemplaren von Listen machen, aber nicht beim Datentyp selbst. Was sollte das denn auch bedeuten? (Stimmt in Python 3.9 nicht mehr so ganz, weil da auch die Grunddatentypen auf diese Art für Typannotationen verwendet werden können, was aber ein ganz anderes Thema ist.)

Über den Datentyp `list` kann man auch nicht iterieren. Auch wieder nur über Exemplare davon, also Listen wo Elemente drin stehen.

Was in der Schleife auch total schräg ist ist `i`. Das wird vor der Schleife an eine 0 gebunden, in der Schleife aber als Laufvariable verwendet. Da erwartest Du anscheinend Zeichenketten mit einzelnen Buchstaben, aber gleich darauf wird dann versucht 1 zu `i` zu addieren, was bei Zeichenketten natürlich nicht geht. Und einen Sinn kann ich darin auch nicht erkennen.

Wenn das mit den Dateien so funktionieren würde, dann steht der `close()`-Aufruf an einer falschen Stelle. Das würde ”funktionieren” falls in der Datei nur ein "o" vorkäme, denn beim nächsten würde versucht in eine bereits geschlossene Datei zu schreiben.

Ich würde noch mal auf `pathlib.Path` hinweisen. Da gibt es Methoden die eine komplette Datei in eine Zeichenkette einlesen und eine Zeichenkette komplett in eine Datei zu schreiben:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path


def main():
    encoding = "utf-8"
    file_path = Path("test2.txt")
    file_path.write_text(
        file_path.read_text(encoding).replace("i", "1"), encoding
    )


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

Meine Aufgabe ist es den Text einzulesen und für ein paar buchtstaben zahlen einzusetzen, und die datei wird in der Aufgabe als wörtbuch bezeichent deshalb hab ichs so genannt. Und ja eigentlich programmiere ich mit einer anderen sprache und komme deshalb mit Python gerade noch nicht zurecht. Mein code ersetzt die einzelnen buchstaben nicht sondern die textdatei ist danach einfach komplett leer.

was genau bedeutet das encoding = "utf-8"? also wozu hast du das gemacht?
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Das was Du jetzt aber beschriebst, hat nichts mit dem Code zu tun, den Du gezeigt hast. Fehlerbeschreibung und Code müssen schon zusammenpassen, sonst kann man schlecht helfen.
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

Sirius3 hat geschrieben: Mittwoch 28. Oktober 2020, 14:19 Das was Du jetzt aber beschriebst, hat nichts mit dem Code zu tun, den Du gezeigt hast. Fehlerbeschreibung und Code müssen schon zusammenpassen, sonst kann man schlecht helfen.
und wie genau muss ich das jetzt machen?
also das ist mein code bis jetzt wie geanu soll ich weitermachen?
def einlesen()
Wörterbuch= open("datei.txt", "r")
for zeile in wörterbuch:
zeile=wörterbuch.readlines()



if__name__== __main__:
einlesen()
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Der Code ist so gar nicht lauffähig, wieder wegen der Groß- und Kleinschreibung.

Mein Vorgehen bei sowas (ohne 3rd Modules) wäre folgendes:

1. Dateieinhalt einlesen, sodass jede Zeile ein Element einer Liste ist.
2. Neue Liste erstellen indem du über die Liste iterierst wo du die Zeilen eingelesen hast und für das aktuelle Element dann i mit einer 1 ersetzen.
3. Die neue Liste Zeilenweise zurückschreiben.

Dateien öffnet man mit dem with Statement, das spart das schließen am Ende, auch das encoding sollte immer angegeben werden.

Code: Alles auswählen

with open("test.txt", "r", encoding='UTF-8') as input_file:
    rows = input_file.readlines()
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

Jankie hat geschrieben: Mittwoch 28. Oktober 2020, 14:38 Der Code ist so gar nicht lauffähig, wieder wegen der Groß- und Kleinschreibung.

Mein Vorgehen bei sowas (ohne 3rd Modules) wäre folgendes:

1. Dateieinhalt einlesen, sodass jede Zeile ein Element einer Liste ist.
2. Neue Liste erstellen indem du über die Liste iterierst wo du die Zeilen eingelesen hast und für das aktuelle Element dann i mit einer 1 ersetzen.
3. Die neue Liste Zeilenweise zurückschreiben.

Dateien öffnet man mit dem with Statement, das spart das schließen am Ende, auch das encoding sollte immer angegeben werden.

Code: Alles auswählen

with open("test.txt", "r", encoding='UTF-8') as input_file:
    rows = input_file.readlines()
also kann ich den code von dir so übernehmen zum einlesen?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Versuch es doch einfach mal und schau dir dann den Inhalt der Variablen an.
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

Jankie hat geschrieben: Mittwoch 28. Oktober 2020, 14:38 Der Code ist so gar nicht lauffähig, wieder wegen der Groß- und Kleinschreibung.

Mein Vorgehen bei sowas (ohne 3rd Modules) wäre folgendes:

1. Dateieinhalt einlesen, sodass jede Zeile ein Element einer Liste ist.
2. Neue Liste erstellen indem du über die Liste iterierst wo du die Zeilen eingelesen hast und für das aktuelle Element dann i mit einer 1 ersetzen.
3. Die neue Liste Zeilenweise zurückschreiben.

Dateien öffnet man mit dem with Statement, das spart das schließen am Ende, auch das encoding sollte immer angegeben werden.

Code: Alles auswählen

with open("test.txt", "r", encoding='UTF-8') as input_file:
    rows = input_file.readlines()
Wie lese ich den die datei ein und Speicher jede Zeile in ein Element der Liste ein
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Das kannst du entweder hier oder auch hier herausfinden.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mois: UTF-8 ist die Kodierung des Textes. Oder eben auch nicht. Das musst letztendlich Du wissen und korrekt angeben. Sonst ”rät” Python mehr oder weniger. Das kann dann richtig sein. Oder auch nicht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

mois hat geschrieben: Mittwoch 28. Oktober 2020, 14:48
Jankie hat geschrieben: Mittwoch 28. Oktober 2020, 14:38 Der Code ist so gar nicht lauffähig, wieder wegen der Groß- und Kleinschreibung.

Mein Vorgehen bei sowas (ohne 3rd Modules) wäre folgendes:

1. Dateieinhalt einlesen, sodass jede Zeile ein Element einer Liste ist.
2. Neue Liste erstellen indem du über die Liste iterierst wo du die Zeilen eingelesen hast und für das aktuelle Element dann i mit einer 1 ersetzen.
3. Die neue Liste Zeilenweise zurückschreiben.

Dateien öffnet man mit dem with Statement, das spart das schließen am Ende, auch das encoding sollte immer angegeben werden.

Code: Alles auswählen

with open("test.txt", "r", encoding='UTF-8') as input_file:
    rows = input_file.readlines()
with open("test.txt", "r", encoding='UTF-8') as f:
list = []
listen = []
for line in f:
list = [f.readlines()]
for wörter in list:
mein code sieht bisher so aus, jedoch komme ich derzeit nicht weiter beim replacen, kannst du mir da behilflich sein
mois
User
Beiträge: 19
Registriert: Mittwoch 28. Oktober 2020, 12:54

mois hat geschrieben: Donnerstag 29. Oktober 2020, 09:50
mois hat geschrieben: Mittwoch 28. Oktober 2020, 14:48
Jankie hat geschrieben: Mittwoch 28. Oktober 2020, 14:38 Der Code ist so gar nicht lauffähig, wieder wegen der Groß- und Kleinschreibung.

Mein Vorgehen bei sowas (ohne 3rd Modules) wäre folgendes:

1. Dateieinhalt einlesen, sodass jede Zeile ein Element einer Liste ist.
2. Neue Liste erstellen indem du über die Liste iterierst wo du die Zeilen eingelesen hast und für das aktuelle Element dann i mit einer 1 ersetzen.
3. Die neue Liste Zeilenweise zurückschreiben.

Dateien öffnet man mit dem with Statement, das spart das schließen am Ende, auch das encoding sollte immer angegeben werden.

Code: Alles auswählen

with open("test.txt", "r", encoding='UTF-8') as input_file:
    rows = input_file.readlines()
with open("test.txt", "r", encoding='UTF-8') as f:
list = []
listen = []
for line in f:
list = [f.readlines()]
for wörter in list:
listen = line.replace("i","1")
print(listen)
mein code sieht bisher so aus, jedoch wird nur in der ersten zeile der datei alles ersetzt und die zweite zeile nicht berücksichtigt, was muss ich anders machen damit der rest der zeilen auch in betracht gezogen wird?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Die erste Zeile ist schon mal richtig. Ab der zweiten fängt es dann an wirr zu werden.

Du musst die Datei öffnen (hast du gemacht)
Dann musst du den Inhalt der Datei so einlesen, dass jede Line in der Datei ein Element einer Liste wird. Das macht man mit readlines(). Dann schaust du dir mal den Inhalt an, den readlines() zurückgibt, das sollte eine Liste sein.
Jetzt durchläüfst du die Liste und für das aktuelle Element (also die aktuelle Zeile) ersetzt du i mit 1, dieses ersetzte Element hängst du einer neuen Liste an. Diese Liste kannst du dann (wenn alle Zeilen durchlaufen sind) zurück in eine andere Datei schreiben.


Sonstige Anmerkungen:
-Du musst nicht immer jeden Post zitieren
-Code bitte in die Code-Tags (vollständiger Editor </>) packen, sonst geht die Einrückung verloren.
-Variablen sollten nach dem Inhalt benannt werden, keine Datentypen. list ist SEHR schlecht als name, da es die gleichnamige Funktion überschreibt.
-Du solltest unbedingt ein Grundlagentutorial durcharbeiten
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

mois hat geschrieben: Mittwoch 28. Oktober 2020, 14:02 was genau bedeutet das encoding = "utf-8"? also wozu hast du das gemacht?
UTF-8 ist eine Zeichenkodierung, die Unicode repräsentiert.
Für Unicode gibt es unterschiedliche Codierungen, aber UTF-8 wird fast überall genutzt.
Die ersten 127 möglichen Zeichen bilden ASCII komplett ab.
Umlaute und alles andere sind zwei Byte oder noch länger, da so ziemlich alle Sprachen auch im Standard enthalten sind.

Früher hatte man für jede Sprache eine eigene Codierung. Der Zoo existiert immer noch, aber glücklicherweise haben sich fast alle auf Unicode geeinigt.

Standardmäßig öffnet Python eine Datei im Textmodus (kein mode angegeben oder nur bei `r`).
Wenn keine Encodierung angegeben wird, wird die Encodierung des Betriebssystems verwendet.
Wenn man nur unter Linux arbeitet, fällt das nie auf, da jedes Linux utf8 als Standard-Encodierung verwendet.
Unter Windows ist es aber cp1252. Wenn man dann unter Windows Dateien öffnet, dessen Encodierung Unicode ist, aber keine Encodierung mit angibt, wird cp1252 verwendet, um die Bytes in Text zu dekodieren.

Deswegen sollte man das Encoding immer mit angeben.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten