CSV, Problem mit Leerzeile

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
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Hi,

Ich versuche gerade eine Tabelle aus einer GUI nach Excel zu kriegen.
Nachdem xlwt für Python 3.2 nicht stable verfügbar ist, wollte ich das mit csv lösen.
Weil ich noch nie mit csv gearbeitet hatte, wollte ich erstmal schauen wie ich das überhuapt schreibe, so coloum für coloum und Zeile für Zeile.

Hier meint Test-Code:

Code: Alles auswählen

file_path = "C:\\Dokumente und Einstellungen\\*username_censored*\\Desktop\\"
        with open(file_path + 'metadata.csv', 'w') as csv_file:
            self.table_writer = csv.writer(csv_file, delimiter=';')
            data = [[(1),(2),(3)],[(4),(5),(6)]]
            for row in data:                
                self.table_writer.writerow(row)            
                print("Done")
Ich will also 1. Zeile mit 1,2,3 haben und 2. Zeile mit 4,5,6 jeweil in verschiedenen Spalten.

Wenn ich das nun laufen lasse und das Ergebnis in Excel öffne, hab ich zwischen den Zeilen, eine Leerzeile. Die Coloumns passen :) .

Ich hab mich schon mit dialect gespielt, aber da krieg ich überhaupt keine coloumns zusammen.

Hat jemand eine Idee ?
BlackJack

@patmaster: Öffne die Datei als Binärdatei.
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

BlackJack hat geschrieben:@patmaster: Öffne die Datei als Binärdatei.
Danke für den Tipp, Leider bekomme ich exceptions:

Code: Alles auswählen

def export_xls_function(self):
        file_path = "C:\\Dokumente und Einstellungen\\szabop\\Desktop\\"
        with open(file_path + 'metadata.csv', 'wb') as csv_file:
            self.table_writer = csv.writer(csv_file, delimiter=';')
            data = [[(1),(2),(3)],[(4),(5),(6)]]
            for row in data:                
                self.table_writer.writerow(row)            

Code: Alles auswählen

TypeError: 'str' does not support the buffer interface
Also habe ich das gemacht:

Code: Alles auswählen

def export_xls_function(self):
        file_path = "C:\\Dokumente und Einstellungen\\szabop\\Desktop\\"
        with open(file_path + 'metadata.csv', 'wb') as csv_file:
            self.table_writer = csv.writer(csv_file, delimiter=';')
            data = [[(1),(2),(3)],[(4),(5),(6)]]
            for row in data:                
                self.table_writer.writerow(bytes(row, 'UTF-8'))                         

Code: Alles auswählen

TypeError: encoding or errors without a string argument
Erst beschwert er sich das es ein str is und dann gibt's errors ohne str argument Oo
Ideen ?
BlackJack

@patmaster: `row` ist ja nun auch wirklich kein `str` sondern eine Liste mit Zahlen. Das scheint also Python 3 zu sein, da gibt es doch ein Kodierungsargument bei `open()`.
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

BlackJack hat geschrieben:@patmaster: `row` ist ja nun auch wirklich kein `str` sondern eine Liste mit Zahlen. Das scheint also Python 3 zu sein, da gibt es doch ein Kodierungsargument bei `open()`.
Ja, sry....da hab ich einfach blind auf die Exception geschaut und das Hirn ausgeschalten.
Das encoding Argument gibt's leider im binary mode nicht.

Weitere Vorschläge ?

//EDIT:

Lösung:

Code: Alles auswählen

with open(file_path + 'metadata.csv', 'w', encoding='UTF-8', newline="") as csv_file:
            self.table_writer = csv.writer(csv_file, delimiter=';')
            data = [[(1),(2),(3)],[(4),(5),(6)]]            
            for row in data:                
                self.table_writer.writerow(row)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Welchen Sinn soll es haben, einzelne Zahlen (oder als Fachausdruck "Integer-Literale") einzuklammern? Entweder du willst Tupel, dann zum Beispiel ``(1,)`` für Tupel, die nur einen Wert enthalten sollen oder ``(1, 2, 3)`` für Tupel mit mehr als einem Wert. Oder aber du willst wirklich nur Zahlen in den Listen (nicht in Tupeln), dann reicht ``[1, 2, 3]`` statt ``[(1), (2), (3)]``. Ich vermute letzteres.
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

derdon hat geschrieben:Welchen Sinn soll es haben, einzelne Zahlen (oder als Fachausdruck "Integer-Literale") einzuklammern? Entweder du willst Tupel, dann zum Beispiel ``(1,)`` für Tupel, die nur einen Wert enthalten sollen oder ``(1, 2, 3)`` für Tupel mit mehr als einem Wert. Oder aber du willst wirklich nur Zahlen in den Listen (nicht in Tupeln), dann reicht ``[1, 2, 3]`` statt ``[(1), (2), (3)]``. Ich vermute letzteres.
Jo stimmt Klammern sind vermutlich nutzlos. kA warum ich die gemacht hab Oo
Antworten