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?
Textdatei einlesen und bearbeiten
- __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.
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
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?
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.
- __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:
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
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?
was genau bedeutet das encoding = "utf-8"? also wozu hast du das gemacht?
und wie genau muss ich das jetzt machen?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.
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()
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.
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 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 einJankie 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()
- __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 hat geschrieben: Mittwoch 28. Oktober 2020, 14:48with open("test.txt", "r", encoding='UTF-8') as f: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()
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 hat geschrieben: Donnerstag 29. Oktober 2020, 09:50mois hat geschrieben: Mittwoch 28. Oktober 2020, 14:48with open("test.txt", "r", encoding='UTF-8') as f: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()
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?
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
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
- DeaD_EyE
- User
- Beiträge: 1240
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
UTF-8 ist eine Zeichenkodierung, die Unicode repräsentiert.mois hat geschrieben: Mittwoch 28. Oktober 2020, 14:02 was genau bedeutet das encoding = "utf-8"? also wozu hast du das gemacht?
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