Import csv in python3

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.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@benpython: statt os.path benutzt man heutzutage pathlib. Wenn man zusätzlich einen Index braucht nimmt man enumerate. for-Schleifen über einen Index macht man gar nicht. Ist es Absicht, das Zeilen ab 1, Spalten aber ab 0 gezählt werden?
Das found = None wird gar nicht verwendet.
Es wird zweimal re.match aufgerufen, was nur zur Klimaerwärmung beiträgt. Wenn Du schon reguläre Ausdrücke benutzt, dann nutze auch, dass man die Groß-Klein-Schreibung ignorieren kann. Ansonsten wäre es eine einfache in-Prüfung.

Code: Alles auswählen

import re
import csv
from pathlib import Path

abrechnung = Path.home() / "Desktop" / "Abrechnung.csv"
pattern = re.compile(r'(amazon)', re.I)
with abrechnung.open(encoding='cp1252') as csvdatei:
    csv_reader_object = csv.reader(csvdatei, delimiter=';')
    for row_index, row in enumerate(csv_reader_object, 1):
        for column_index, cell in enumerate(row):
            match = pattern.match(cell)
            if match is not None:
                found = match.group(1)
                print(f'Suchwort "{found}" gefunden in Zeile {row_index}, Spalte {column_index}')
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Moooment: `match()` kann man nicht durch ``in`` ersetzen, das ist `startswith()`. 🙂
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Steffi
User
Beiträge: 26
Registriert: Sonntag 4. Oktober 2020, 20:40

HI, danke euch für eure Beiträge. Probiere gleich den Code mal aus.
Mein Code sieht bisher so aus. (sehr anders)

Code: Alles auswählen

import csv

search = input("Suchbegriff: ")
with open("04_20_1.csv",encoding="cp1252") as csvdatei:
    csv_reader_object = csv.DictReader(csvdatei,delimiter=';')
    zeilennummer = 0
    for i in csv_reader_object:
        print(i)
        for search in csv_reader_object:    
            if search == csv_reader_object:
                print("Gefunden")
            else:
                print("error", zeilennummer)
                zeilennummer += 1
Leider funktioniert immer noch nicht mein Finden nach dem Suchbegriff. Er zeit mir immer error, also die else, schleife als Ergebnis.
Steffi
User
Beiträge: 26
Registriert: Sonntag 4. Oktober 2020, 20:40

Habe jetzt den Code von Sirius ausprobiert und wollte noch eine search-Zeile mit Eingabe Suchbegriff einbauen. Leider habe ich jetzt irgendwo einen Fehler eingebaut.

Code: Alles auswählen

import re
import csv
from pathlib import Path

search = input("Suchbegriff: ")
pattern = re.compile(r'(search)', re.I)
with open("04_20_1.csv",encoding="cp1252") as csvdatei:
    csv_reader_object = csv.reader(csvdatei, delimiter=';')
    for row_index, row in enumerate(csv_reader_object, 1):
        for column_index, cell in enumerate(row):
            match = pattern.match(cell)
            if match is not None:
                found = match.group(1)
                print(f'Suchwort "{found}" gefunden in Zeile {row_index}, Spalte {column_index}')
Steffi
User
Beiträge: 26
Registriert: Sonntag 4. Oktober 2020, 20:40

Sorry, Code kam ursprünglich von benpython.
@benpython: danke dir sehr für den code!!
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du einen Fehler erhältst, dann poste doch die genaue Fehlermeldung.

Beim vorhergehenden Code: `i` ist ein schlechter Name für eine Zeile. Richtige Namen sind wichtig für das Verständnis. In der inneren for-Schleife überschreibst Du die Variable `search`. Und die kann niemals dem csv_reader_objekt sein. Was willst Du wirklich miteinander vergleichen?
`zeilennummer` zählt keine Zeilen.
Steffi
User
Beiträge: 26
Registriert: Sonntag 4. Oktober 2020, 20:40

Mein Code funktioniert ohne Fehler, ich bekomme dies als Ergebnis:
python3 Neu.py
Suchbegriff: Amazon
OrderedDict([('Buchungstag', '01.04.2020'), ('Wert', '01.04.2020'), ('Umsatzart', 'SEPA-Gutschrift von'), ('Begünstigter / Auftraggeber', 'DB PFK AG'), ('Verwendungszweck', 's.Zahlungsavis'), ('IBAN', '.......'), ('BIC', 'DEUTDEDBFRA'), ('Kundenreferenz', '.'), ('Mandatsreferenz ', ''), ('Gläubiger ID', ''), ('Fremde Gebühren', ''), ('Betrag', ''), ('Abweichender Empfänger', ''), ('Anzahl der Aufträge', ''), ('Anzahl der Schecks', ''), ('Soll', ''), ('Haben', '....'), ('Währung', 'EUR')])
error 0
error 1
error 2
error 3
error 4
error 5
error 6
error 7
error 8
error 9
error 10
error 11
error 12
error 13
error 14
error 15
error 16
error 17
error 18
error 19
error 20
error 21
error 22
error 23
error 24
error 25
error 26
error 27
error 28
error 29
error 30
error 31
error 32
error 33

Dann war das Glück mit der Zeilennummer, aber ich bekomme diese doch mit den Zahlen nach error ausgewiesen.
Okay, also meine zweite for Schleife wird überschrieben und wird deshalb nicht abgefragt. Ich möchte mit der zweiten for Schleife abfrage, ob search, also mein Suchbegriff, in dem csv Text vorhanden ist.
Steffi
User
Beiträge: 26
Registriert: Sonntag 4. Oktober 2020, 20:40

Zu dem anderen Code. WIe kann ich dort eine search-Schleife einbauen??? Was bedeutet denn re.I in der zweiten Zeile???
Steffi
User
Beiträge: 26
Registriert: Sonntag 4. Oktober 2020, 20:40

Kann mir keiner mehr helfen????
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Wobei? Wo ist das konkrete Problem, dass du noch hast?
Steffi
User
Beiträge: 26
Registriert: Sonntag 4. Oktober 2020, 20:40

Wie ich oben geschrieben habe. Ich möchte in den Code noch eine Suchschleife einbauen. Aber ich kann diese wohl nicht in pattern packen. Und dann möchte ich gerne das Datum zum Suchbegriff ausgeben und weiss nicht wie.
Hier der Code nochmal mit meinem eingefügten search-Befehl. Ich verstehe auch nicht was in der Zeile pattern re.I bedeutet.

Code: Alles auswählen

import re
import csv
from pathlib import Path

search = input("Suchbegriff: ")
pattern = re.compile(r'(search)', re.I)
with open("04_20_1.csv",encoding="cp1252") as csvdatei:
    csv_reader_object = csv.reader(csvdatei, delimiter=';')
    for row_index, row in enumerate(csv_reader_object, 1):
        for column_index, cell in enumerate(row):
            match = pattern.match(cell)
            if match is not None:
                found = match.group(1)
                print(f'Suchwort "{found}" gefunden in Zeile {row_index}, Spalte {column_index}')
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

r'(search)' sucht natürlich nach search, dass es auch einer Variable search gibt, spielt zum Glück keine Rolle. Was re.I macht kann man einfach in der Dokumentation des re-Moduls nachlesen. Wenn du aber nicht wirklich reguläre Ausdrücke brauchst, würde ich die an deiner Stelle auch nicht verwenden.
Wenn der Suchbegriff exakt einem Eintrag entsprechen soll, wäre der Vergleich einfach search == cell.
Antworten