Mit csv writer Zeile ergänzen

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.
Antworten
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

Hallo Zusammen,
ich bräuchte einen kleinen denk Anstoß bei meinem aktuell Programm:

Code: Alles auswählen

with open('Daten.csv', 'r+', encoding='utf-8', newline='') as csv_datei:
    dialect = csv.Sniffer().sniff(csv_datei.readline())
    csv_datei.seek(0)
    reader = csv.reader(csv_datei, dialect)
   
    kopfzeile = next(reader)
    
    for zeile in reader:
        if zeile[1] in data:
            
            
        else:
            print("Fehler: Nicht  gefunden")
 
Die Theorie sieht ganz einfach aus: Falls die Zeile 1 in data ist, soll die jeweilige Zeile um Informationen ergänzt werden. Das ganze in einer for- Schleife, da es in der Csv-Datei mehrere Zeilen gibt, welche unabhängig betrachtet werden und ergänzt werden sollen.
Allgemein die Frage: Bin ich momentan auf dem Falschen Weg? Wie würde ein Writer aussehen, der eine Zeile ergänzt und nicht erst am Ende der Datei etwas schreibt...

Ich bin für jeweilige Tipps, Anregungen und Verbesserungen dankbar, da ich gerade erst am Anfang meines Python daseins bin :D .
Vielen Dank schonmal im Voraus.
Corn
P_Python
User
Beiträge: 19
Registriert: Donnerstag 11. November 2021, 19:45

Du kannst z.B. deine Datei zeilenweise in eine Liste auslesen, dann die Liste verändern und dann diesen veränderten Inhalt wieder in eine Datei schreiben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Filemode r+ ist für Text-Dateien nie sinnvoll, weil man entweder eine Datei liest oder schreibt.
Man kann keine Text-Datei verändern, sie muß immer komplett geschrieben werden.

Das einfachste ist es, mit drei Schritten anzufangen:
1. Daten lesen
2. Daten modifizieren
3. Daten schreiben.

Das kann man dann auch alles in einer Schleife machen, wird nur entsprechend komplex.

Du schreibst auch nicht, was konkret gemacht wird, und was bei "Fehler" passieren soll.
Man sollte eigentlich nicht per Sniffer raten, wie die csv-Datei formatiert ist, sondern das explizit angeben. Sonst können leicht Fehler passieren.
Z.B. für typische deutsche Excel-CSVs:

Code: Alles auswählen

csv.Sniffer().sniff("1,2;4,6").delimiter
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ich würde die Quell- und Zieldatei jeweils zum Lesen bzw. Schreiben öffnen.
(In Python 3.10 gibt es für mehrere Context-Manager auch eine schönere Schreibweise)
https://docs.python.org/3/whatsnew/3.10 ... t-managers

Die Quelldatei zeilenweise lesen
Die jeweilige Zeile in die Zieldatei schreiben
Die jeweilige Zeile auswerten und
- wenn weitere Daten eingefügt werden sollen, diese zusätzlichen Zeilen in die Zieldatei geschrieben
Wiederholen bis die Quelldatei vollständig gelesen ist.
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

Vielen dank @P_Python, @Sirius3 und @rogerb! Ich werde mich mal mit euren Antworten auseinandersetzten und ausprobieren. Hat mir auf jeden Fall schonmal weiter geholfen. Falls ich dann immer noch nicht weiterkomme, melde ich mich nochmal :geek: :D
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sirius3 hat geschrieben: Freitag 12. November 2021, 11:52 Man sollte eigentlich nicht per Sniffer raten, wie die csv-Datei formatiert ist, sondern das explizit angeben. Sonst können leicht Fehler passieren.
Z.B. für typische deutsche Excel-CSVs:

Code: Alles auswählen

csv.Sniffer().sniff("1,2;4,6").delimiter
Wobei man den Feldtrenner explizit mitgeben kann. Es bleibt dann immer noch die Unsicherheit des Ratens, aber in der Regel passen die Ergebnisse (nach meiner Erfahrung). Praktisch im Gegensatz zum direkten reader()-Aufruf finde ich dabei, dass er dann mit Quoting besser klar kommt. Eine simple Funktion, um an die Datensätze einer CSV-Datei zu kommen, kann dann so aussehen:

Code: Alles auswählen

import csv

def get_rows(filename, encoding="utf-8", sep=",", samplesize=1024):
    with open(filename, encoding=encoding, newline="") as stream:
        sample = stream.read(samplesize)
        stream.seek(0)
        dialect = csv.Sniffer().sniff(sample, sep)
        yield from csv.reader(stream, dialect)
Antworten