Kann das Ergebnis der IF Abfrage nicht speichern

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
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Das ist die Daten csvcodesfile:
15001; 100
16001; 101
18001; 102
60613; 103
60624; 104
98002; 105
ALA77; 106
ALA77R; 107
3230000000000; 108

with open('C:/users/PycharmProjects/testordner/CodeszumSuchenTest.csv', 'r', encoding="cp850") as csvcodesfile:
csvleser1 = csv.reader(csvcodesfile, delimiter=';') # für CodeszumSuchen - csvleser1
zeile = csvleser1 # codeszumsuchen
print("Zeile 1")
for row in zeile: # codeszumsuchen
with open('C:/users/PycharmProjects/testordner/dataklein.csv', 'r', encoding="cp850") as csvdatafile:
csvleser2 = csv.reader(csvdatafile, delimiter=';') # für datanorm
zeile2 = csvleser2 # datanorm
with open('C:/users/MELACH/PycharmProjects/testordner/dataselek.csv', 'w', newline='') as daten:
writer = csv.writer(daten, delimiter=';')
for elem in zeile2: # datanorm
if elem[0] == 'A' and (elem[2] == row[0]): #selektieren nur der A-Sätze
print("Das ist die elem", elem)
writer.writerow(elem)

Das Print Ergebnis nach Start des Programmes:
Das ist die elem ['A', 'N', '15001', '00', 'Test Artikel', '48cm, Mauerwerksbau', '1', '0', 'ST', '1445', '572Z', '134', ' ', '']
Das ist die elem ['A', 'N', '16001', ....
Das ist die elem ['A', 'N', '18001',....
Das ist die elem ['A', 'N', '60613',....
Das ist die elem ['A', 'N', '60624', ....
Das ist die elem ['A', 'N', '98002',....
Das ist die elem ['A', 'N', '3230000000000', '00', ......

Das Ergebnis ist auch in Ordnung nur wird immer nur die LETZTE Zeile in die Datei dataselek.csv gespeichert,
und ich komm nicht drauf warum. Würde gerne alle angedruckten Zeile in eine Datei speichern.

Datei dataselek.csv:
A;N;3230000000000;00;Zwanzigster Testartikel;FT Leerverrohrung 4 Fach;1;0;ST;5431;296Z;134; ;

Könnt Ihr mir da bitte Helfen. Danke im Vorraus
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ossi047: Du überschreibst die Datei mit jedem gefundenen Ergebnis. Öffne die Ergebnisdatei *einmal* zum Schreiben und nicht für jede Zeile aus der ersten Eingabedatei.

Die Namen sind übrigens besch…eiden. Nummeriere keine Namen und so etwas wie ``for row in zeile:`` ist ja sowas von offensichtlich falsch und unsinnig benannt…

Pfade/Pfadteile sollten nicht mehrfach im Quelltext wiederholt werden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Danke für die schnelle Antwort. ""Öffne die Ergebnisdatei *einmal* zum Schreiben und nicht für jede Zeile aus der ersten Eingabedatei."" Für diese Antwort würde
ich noch Hilfe brauchen "In welcher Zeile soll genau der Code für das schreiben hinkommen"? Könnte ich da ein kurzes Beispiel bekommen?

Der Ordnung halber möchte ich noch erwähnen, dass es sich hier um eine Testdatei handelt. Wenn das funktioniert wird die Datei dann in das Hauptprogramm natürlich mit den Empfehlungen von Dir eingebaut.

with open('C:/users/PycharmProjects/testordner/CodeszumSuchenTest.csv', 'r', encoding="cp850") as csvcodesfile:
csvleser1 = csv.reader(csvcodesfile, delimiter=';') # für CodeszumSuchen - csvleser1
zeile = csvleser1 # codeszumsuchen
print("Zeile 1")
for row in zeile: # codeszumsuchen
with open('C:/users/PycharmProjects/testordner/dataklein.csv', 'r', encoding="cp850") as csvdatafile:
csvleser2 = csv.reader(csvdatafile, delimiter=';') # für datanorm
zeile2 = csvleser2 # datanorm
for elem in zeile2: # datanorm
if elem[0] == 'A' and (elem[2] == row[0]): #selektieren nur der A-Sätze
print("Das ist die elem", elem)

Wo soll das Speichern der Abfrage: if elem[0] == 'A' and (elem[2] == row[0]): #selektieren nur der A-Sätze hinkommen mit Nummern aus csvcodesfile?

Abfrage Speichern:
with open('C:/users/PycharmProjects/testordner/dataselek.csv', 'w', newline='') as daten:
writer = csv.writer(daten, delimiter=';')
writer.writerow(elem)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, 8 sind einfach zu viele.
Warum nennst Du Deinen csvleser1 in zeile um, bzw. warum benutzt Du nicht gleich zeile, bzw. eigentlich zeilen, weil das sind ja mehrere?
Für jeden Eintrag der ersten csv-Datei immer die gesamte zweite zu lesen ist ziemliche Verschwendung. Lies doch die Datei einmal in eine passende Datenstruktur.

Code: Alles auswählen

DATAKLEIN = 'C:/users/PycharmProjects/testordner/dataklein.csv'
DATASELECT = 'C:/users/MELACH/PycharmProjects/testordner/dataselek.csv'
DATACODES = 'C:/users/PycharmProjects/testordner/CodeszumSuchenTest.csv'

datanorm = {}
with open(DATAKLEIN, encoding="cp850", newline="") as csvdatafile:
    zeilen = csv.reader(csvdatafile, delimiter=';')
    for element in zeilen:
        if element[0] == 'A':
            #selektieren nur der A-Sätze
            datanorm[element[2]] = element

with open(DATASELECT, 'w', newline='') as daten:
    writer = csv.writer(daten, delimiter=';')
    with open(DATACODES, encoding="cp850", newline="") as csvcodesfile:
        zeilen = csv.reader(csvcodesfile, delimiter=';')
        for element in zeilen:
            if element[0] in datanorm:
                writer.writerow(datanorm[element[0]])
ossi047
User
Beiträge: 46
Registriert: Donnerstag 19. Dezember 2019, 15:57

Das funktioniert einwandfrei!!!! Nochmals vielen vielen Dank für den Beispielcode Sirius 3. Da wäre ich NIE draufgekommen.
Antworten