Python - bytearray in CSV Liste

Max-Berater

Erfahrenes Mitglied
Habe mein Python Skript dem Laptop nun dank eurer Hilfe fertig bekommen.

Das gleiche Skript auf dem Hauptrechner macht Probleme.

In der CSV bekomme ich immer in bestimmten Feldern
hier anstatt 21.99 - bytearray(b'21.99') angezeigt

Wo muss ich ansetzen, dass zu lösen. Ist ggf. ein Plugin/ Modul nicht installiert?
 
Ich poste mal den Code, der die Daten aus der DB in die CSV schreibt.
Code:
cnx = mysql.connector.connect(
    host="xx-xxxx.de",
    user="xx",
    password="xxx",
    database="xxx")
cursor = cnx.cursor()


# SQL-Abfrage ausführen
cursor.execute("SELECT * FROM TESTDB")

# Ergebnisse der Abfrage in eine CSV-Datei schreiben


with open("C:\\Users\\admin\\OneDrive\\FIBU\\TESTDATEI.csv", 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerow([i[0] for i in cursor.description])  # Schreibt die Spaltennamen in die erste Zeile
    writer.writerows(cursor)

# Verbindung zur Datenbank schließen
cnx.close()

In der Datenbank sind die Werte richtig hinterlegt und wenn ich den Export der Daten über Heidi SQL ausführe ist auch alles prima. Wie geschrieben, es funktioniert ja, nur leider auf dem Laptop, wo ich den Code gebastelt habe und nicht auf dem Hauptrechner
 
Zuletzt bearbeitet:
Sehr schön, danke.
Da du deinen Code gepostet hast, wurde mir relativ schnell klar, dass es mit den Werten zu tun haben muss, die mysql.connector.* als Iterable zurückgibt.

Wie sich herausstellte, wurde genau dieses Verhalten mit dem Sprung auf Version 8.0.24 gefixt:
Binary columns were returned as strings instead of 'bytes' or 'bytearray'. (Bug #29622520, Bug #30349010, Bug #30416704, Bug #94944, Bug #96999, Bug #97177, Bug #97723)
Warum? Naja, das Ganze hat mit Collation zu tun. Genauer nachlesen kannst du das hier.

Ein quick'n'dirty Fix könnte so aussehen:
Python:
# Ergebnisse der Abfrage in eine CSV-Datei schreiben

with open("C:\\Users\\admin\\OneDrive\\FIBU\\TESTDATEI.csv", 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerow([i[0] for i in cursor.description])  # Schreibt die Spaltennamen in die erste Zeile
    writer.writerows((map(lambda x: x.decode('utf-8') is isinstance(x, bytearray) else x, row)
                      for row in cursor))
#...

Gruß Technipion
 

Neue Beiträge

Zurück