Seite 1 von 1

CSV, Problem mit Leerzeile

Verfasst: Freitag 24. August 2012, 09:23
von patmaster
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 ?

Re: CSV, Problem mit Leerzeile

Verfasst: Freitag 24. August 2012, 09:27
von BlackJack
@patmaster: Öffne die Datei als Binärdatei.

Re: CSV, Problem mit Leerzeile

Verfasst: Freitag 24. August 2012, 10:04
von patmaster
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 ?

Re: CSV, Problem mit Leerzeile

Verfasst: Freitag 24. August 2012, 10:17
von 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()`.

Re: CSV, Problem mit Leerzeile

Verfasst: Freitag 24. August 2012, 10:27
von patmaster
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)

Re: CSV, Problem mit Leerzeile

Verfasst: Freitag 24. August 2012, 12:51
von derdon
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.

Re: CSV, Problem mit Leerzeile

Verfasst: Freitag 24. August 2012, 12:56
von patmaster
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