Seite 1 von 1

Prüfung ob Wert in geschriebener .csv vorhanden ist, wenn ja... dann...

Verfasst: Dienstag 5. November 2019, 10:21
von Enne1008
Hallo,

vorab,ich versuche mich gerade in python, damit würde ich mich als absoluten Anfänger bezeichnen.
Im Job , stehe ich nun vor folgendem Problem:



ich möchte aus den einzelnen csv Datein nur die Datensätze finden und eine Sammlerdatei schreiben, welche den Begriff "Stufe " enthalten.
Nun werden bei jedem Durchlauf die bereits in der Sammlerdatei vorhandenen Daten nochmals mit reingeschrieben.

Das dict. ist die Verbindung zwischen dem Dateinnamen der einzlenen CSV und der Identnummer für das Produkt ( 0.csv: TR1901000 usw.)

Gibt es eine Möglichkeit, dies zu verhindern.
Grundidee ist folgende: prüfe ob Datensatz in der Sammlerdatei? Wenn ja, dann überspringe, wenn nein dann schreibe diesen in den Sammler

anbei mein bisheriger Code:

Code: Alles auswählen

import csv
import os

d = {...}

l= os.listdir("C:/Users/en/Datensammler/csvlisten")

for i in l:
    if i =="desktop.ini" or i=="Stufen_Sammler.csv" or i=="Wangen_Sammler":
        continue
    else:
        trn = d.get(i)
        with open ("C:/Users/en/Datensammler/csvlisten/"+ i, encoding= "latin-1", newline="") as file:
            reader = csv.reader(file, delimiter=",")

            for line in reader:
                trn = d.get(i)
                if "Stufe  " in line:
                    with open ("C:/Users/en/Datensammler/csvlisten/Stufen_Sammler.csv","a", encoding="latin-1",newline="") as csvfile:
                        
                        writer= csv.writer(csvfile, delimiter=",")
                        writer.writerow(line+[trn])

                        print(line)
Hat jemand eine Idee?

Besten Dank vorab...

Re: Prüfung ob Wert in geschriebener .csv vorhanden ist, wenn ja... dann...

Verfasst: Dienstag 5. November 2019, 10:40
von sparrow
Tu dir selbst einen Gefallen und nimm wirklich aussagekräftige Variablen. Es ist nicht "l" sonder "filenames". Es ist nicht "i" sondern "filename". Ich habe keine Ahnung was "trn" ist - turn? truncate? trinity? transglutamase?

Wenn du vorher wissen willst, was in der Sammerdatei steht, lese sie und merk dir die einzigartigen Felder eines Datensatzes in einer entsprechenden Datenstruktur - zum Beispiel einer Liste. Etwa die Artikelnummer. Dann kannst du vor dem Schreiben prüfen, ob die ID bereits vorhanden ist.

Für die ganzen Sachen mit Dateipfaden solltest du dir pathlib anschauen.

Re: Prüfung ob Wert in geschriebener .csv vorhanden ist, wenn ja... dann...

Verfasst: Dienstag 5. November 2019, 10:47
von Sirius3
Zum Code: `l` und `i` sind die schlechtesten Variablennamen die es gibt, vor allem lese ich ein `for i in EINS` was keinen Sinn macht. Benutze sprechende Variablennamen und keine Abkürzungen. Was ist `d` oder `trn`?
Statt explizit Dateien auszuschließen, benutze Filename-Pattern, z.B. mit dem pathlib-Modul (os.listdir ist veraltet). Wenn `Stufen_Sammler.csv` eine andere Endung bekommt, dann ließe sich der Ausdruck sehr einfach als *.csv schreiben.
Pfade setzt man nicht mit + zusammen, sondern nimmt pathlib.Path und /.
Wenn Du ein `continue` hast, brauchst Du kein `else`.
Eine Datei ständig wieder zu öffnen, um nur eine Zeile anzufügen, ist verschwenderisch.
An welcher Stelle in der CSV-Datei tritt "Stufe " auf? Das ist doch hoffentlich immer die selbe Spalte und sollte daher auch explizit geprüft werden.

Code: Alles auswählen

from pathlib import Path
BASEPATH = Path("C:/Users/en/Datensammler/csvlisten")
SAMMLER = BASEPATH / "Stufen_Sammler.csv"

with SAMMLER.open("a", encoding="latin-1") as output:
    writer = csv.writer(SAMMLER, delimiter=",")
    for filename in BASEPATH.glob("*.csv"):
        if filename == SAMMLER:
            continue
        trn = d[filename.name] # Was soll das bedeuten?
        with filename.open("a", encoding="latin-1") as csv_input:
            reader = csv.reader(csv_input, delimiter=",")
            for row in reader:
                if row[richtige_spalte] == "Stufe  ":
                    writer.writerow(row + [trn])
Wenn Du schon verarbeitet Dateien nicht nochmals verarbeiten willst, dann mußt Du sie in irgendeiner Form merken. Z.B. indem Du den Dateinamen in eine weitere Datei schreibst.

Re: Prüfung ob Wert in geschriebener .csv vorhanden ist, wenn ja... dann...

Verfasst: Dienstag 5. November 2019, 11:26
von __blackjack__
@Sirius3: Da wir nicht wissen was `d` ist, würde ich aus ``d.get(…)`` kein ``d[…]`` machen, denn dann bekommt man statt `None` ja eine Ausnahme wenn der Schlüssel nicht vorhanden ist.

Re: Prüfung ob Wert in geschriebener .csv vorhanden ist, wenn ja... dann...

Verfasst: Dienstag 5. November 2019, 11:40
von __blackjack__
Da waren noch ein paar andere Kleinigkeiten (`output` nicht verwendet, falscher Dateimodus bei den gelesenen Dateien):

Code: Alles auswählen

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

BASEPATH = Path("C:/Users/en/Datensammler/csvlisten")
SAMMLER = BASEPATH / "Stufen_Sammler.csv"
DELIMITER = ","
ENCODING = "latin-1"


def main():
    filename_to_trn = {"test.csv": "trn-Wert"}  # Was soll das bedeuten?

    with SAMMLER.open("a", encoding=ENCODING) as output:
        writer = csv.writer(output, delimiter=DELIMITER)
        for filename in BASEPATH.glob("*.csv"):
            if filename != SAMMLER:
                with filename.open(encoding=ENCODING) as csv_input:
                    reader = csv.reader(csv_input, delimiter=DELIMITER)
                    trn = filename_to_trn.get(filename.name, "None")
                    for row in reader:
                        if row[richtige_spalte] == "Stufe  ":
                            writer.writerow(row + [trn])


if __name__ == "__main__":
    main()

Re: Prüfung ob Wert in geschriebener .csv vorhanden ist, wenn ja... dann...

Verfasst: Dienstag 5. November 2019, 13:07
von Enne1008
Hallo an alle,

danke für die Hinweise. Ich werde diese umsetzen.
path... schaue ich mir an.

Die Stufe kommt immer in der selben Spalte vor