Seite 1 von 1

CSV lesen und neue CSV schreiben

Verfasst: Sonntag 30. Januar 2022, 21:53
von erci74
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()


Re: CSV lesen und neue CSV schreiben

Verfasst: Sonntag 30. Januar 2022, 22:51
von Sirius3
`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()

Re: CSV lesen und neue CSV schreiben

Verfasst: Montag 31. Januar 2022, 07:06
von erci74
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.

Re: CSV lesen und neue CSV schreiben

Verfasst: Montag 31. Januar 2022, 08:09
von Sirius3
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()

Re: CSV lesen und neue CSV schreiben

Verfasst: Montag 31. Januar 2022, 08:32
von erci74
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'])

Re: CSV lesen und neue CSV schreiben

Verfasst: Montag 31. Januar 2022, 09:12
von Sirius3
Wenn Du verstanden hast, wie ein DictWriter funktioniert, dann sollte sich die Frage von selbst beantworten. Lies einfach mal die Dokumentation dazu durch.

Re: CSV lesen und neue CSV schreiben

Verfasst: Montag 31. Januar 2022, 10:39
von erci74
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!

Re: CSV lesen und neue CSV schreiben

Verfasst: Montag 31. Januar 2022, 12:47
von __blackjack__
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()

Re: CSV lesen und neue CSV schreiben

Verfasst: Montag 31. Januar 2022, 13:10
von erci74
VIELEN DANK es funktioniert. Das gibt mir auch die Motivation wie nutzbar Python für alles sein kann.