CSV lesen und neue CSV schreiben

Code-Stücke können hier veröffentlicht werden.
Antworten
erci74
User
Beiträge: 5
Registriert: Sonntag 30. Januar 2022, 21:42

Hallo Forummitglieder,

ich bin Python Anfänger und wollte mir für die Arbeit ein Prozess automatisieren.
Ich habe eine CSV Datei(siehe unten). Die Kopfzeile soll so übernommen werden. Durch eine Eingabe beispw. Python soll dann alles mit Python und die Spalte y mit dem zugehörigen wert ausgegeben werden.
Geschafft habe ich das im print auch die Datei gefiltert wird, dann siehts so aus:
Python , 20
Python , 26
Python , 25
Python , 22

Mein Wunsch wäre das ich in der Kopfzeile noch x,y stehen habe, das kriege ich noch hin. Aber das ganze möchte ich in eine CSV datei wegschreiben. Leider fällt mir das schwer das ganze in eine neue Datei zu schreiben. Könnt Ihr mir da weiterhelfen.




CSV:
x,y
Python,20
C++,30
Java,40
Python,20
Python,26
Python,25
Python,22

Code: Alles auswählen

#!/usr/bin/env python3

import csv
kopfzeile = []


def main():
    keyword = input("Bitte Suchwort eingeben:")
    with open('neu.csv', newline='') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=',')
        kopfzeile = next(reader)
        for row in reader:
            if keyword in row['x']:
                print(row['x'],",",row['y'])




    with open('neu333311.csv', 'w',encoding='utf-8') as csv_schreib_datei:
        writer = csv.writer(csv_schreib_datei, delimiter=',')
        writer.writerow(kopfzeile)
        writer.writerows(row['x'],",",row['y'])



if __name__ == '__main__':
    main()

Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

`kopfzeile` wird global als leere Liste definiert, aber zum Glück nicht verwendet. Kann also weg.
`writerows` erwartet eine Liste mit Zeilen, die geschrieben werden sollen, die mußt Du aber erst erzeugen, z.b. in dem Du die passenden Zeilen beim Einlesen in einer Liste speicherst:

Code: Alles auswählen

#!/usr/bin/env python3
import csv

def main():
    keyword = input("Bitte Suchwort eingeben:")
    results = []
    with open('neu.csv', encoding='utf-8', newline='') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=',')
        kopfzeile = next(reader)
        for row in reader:
            if keyword in row['x']:
                results.append(row)

    with open('neu333311.csv', 'w', encoding='utf-8', newline='') as csv_schreib_datei:
        writer = csv.writer(csv_schreib_datei, delimiter=',')
        writer.writerow(kopfzeile)
        writer.writerows(results)

if __name__ == '__main__':
    main()
erci74
User
Beiträge: 5
Registriert: Sonntag 30. Januar 2022, 21:42

Hallo,

Danke für die schnelle Antwort. Ich hab das mal so übernommen, jetzt gibt der mit als Ergebnis folgendes an:

x,y
x,y
x,y
x,y
x,y

sozusagen immer die Kopfzeile.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich habe übersehen, dass Dein `reader` ein DictReader ist, also muß der writer auch ein DictWriter sein:

Code: Alles auswählen

#!/usr/bin/env python3
import csv

def main():
    keyword = input("Bitte Suchwort eingeben:")
    with open('neu.csv', encoding='utf-8', newline='') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=',')
        kopfzeile = reader.fieldnames
        results = []
        for row in reader:
            if keyword in row['x']:
                results.append(row)

    with open('neu333311.csv', 'w', encoding='utf-8', newline='') as csv_schreib_datei:
        writer = csv.DictWriter(csv_schreib_datei, delimiter=',', fieldnames=kopfzeile)
        writer.writeheader()
        writer.writerows(results)

if __name__ == '__main__':
    main()
erci74
User
Beiträge: 5
Registriert: Sonntag 30. Januar 2022, 21:42

Wie wäre es wenn ich in der Kopfzeile mehr als nur x,y hätte.
bspw. x,y,z,a

auch immer mit jeweils mit 4 spalten gefüllt, das der mir dann am Ende aber
nur die Ergebnisse von x und y ausgibt wenn das keyword übereinstimmt.

nur diese Stelle zu ändern hilft nicht oder?
results.append(row['x'],row['y'])
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du verstanden hast, wie ein DictWriter funktioniert, dann sollte sich die Frage von selbst beantworten. Lies einfach mal die Dokumentation dazu durch.
erci74
User
Beiträge: 5
Registriert: Sonntag 30. Januar 2022, 21:42

Kannst du mir vlt nur ein Tipp geben?
Funktioniert das mit DictWriter?
writer = csv.DictWriter(csv_schreib_datei, delimiter=',', fieldnames=kopfzeile)

Denke in der Zeile muss ich was ändern oder? bin schon am probieren.

Danke für deine Hilfen bis jetzt. TOP!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn Quell- und Zieldatei unterschiedlich sind, dann muss man nicht alles in den Speicher lesen, sondern kann von Quelle zu Ziel Datensatz für Datensatz filtern/kopieren. Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv
from functools import partial
from operator import itemgetter


def main():
    delimiter = ","
    fieldnames = ["x", "y"]
    open_csv = partial(open, encoding="utf-8", newline="")
    get_values = itemgetter(*fieldnames)

    keyword = input("Bitte Suchwort eingeben:")
    with open_csv("neu.csv", "r") as in_file:
        reader = csv.DictReader(in_file, delimiter=delimiter)
        rows = (get_values(row) for row in reader if keyword in row["x"])
        with open_csv("neu333311.csv", "w") as out_file:
            writer = csv.writer(out_file, delimiter=delimiter)
            writer.writerow(fieldnames)
            writer.writerows(rows)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
erci74
User
Beiträge: 5
Registriert: Sonntag 30. Januar 2022, 21:42

VIELEN DANK es funktioniert. Das gibt mir auch die Motivation wie nutzbar Python für alles sein kann.
Antworten