Seite 1 von 1

csv in Python 2.5

Verfasst: Dienstag 10. April 2007, 16:26
von Rebecca
Folgendes einfaches Programm

Code: Alles auswählen

import csv

print csv.QUOTE_MINIMAL, type(csv.QUOTE_MINIMAL)

class ExcelDe(csv.Dialect):
    def __init__(self):
        self.quoting = csv.QUOTE_MINIMAL
        

csv.register_dialect("excel_de", ExcelDe)
funktioniert unter dem von Suse mitgelieferten Python 2.4 und auf Win mit Python 2.4. Mit selbstkompiliertem Python 2.5 unter Linux und Python 2.5 unter Win gibts ne merkwuerdige Fehlermeldung:

Code: Alles auswählen

rbreu@zam285:~> python2.4 test.py
0 <type 'int'>
rbreu@zam285:~> python2.5 test.py
0 <type 'int'>
Traceback (most recent call last):
  File "test.py", line 10, in <module>
    csv.register_dialect("excel_de", ExcelDe)
TypeError: "quoting" must be an integer
Hab ich was entscheidendes verpasst oder ist das eventuell ein Bug?

Verfasst: Dienstag 10. April 2007, 16:34
von BlackVivi

Code: Alles auswählen

import csv 

print csv.QUOTE_MINIMAL, type(csv.QUOTE_MINIMAL) 

#class ExcelDe(csv.Dialect): 
#    def __init__(self): 
#        self.quoting = csv.QUOTE_MINIMAL
        

csv.register_dialect("excel_de", csv.QUOTE_MINIMAL)

So funktionierts auf jedenfall...

Code: Alles auswählen

import csv 

print csv.QUOTE_MINIMAL, type(csv.QUOTE_MINIMAL) 

class ExcelDe(csv.Dialect): 
    def __init__(self): 
        self.quoting = csv.QUOTE_MINIMAL 
        

csv.register_dialect("excel_de", ExcelDe.quoting)

Und so auch. ExcelDe is ja'n Classobj... ich weiß nit, ob das dein Problem löst oO' Ich weiß auch nicht so genau, was du machen möchtest.

Verfasst: Dienstag 10. April 2007, 16:46
von Y0Gi
Ich kann den Fehler unter Windows mit Py2.5 reproduzieren.

Möglicherweise schafft Py2.5.1 Abhilfe: http://www.python.org/download/releases/2.5.1/NEWS.txt (vgl. Abschnitt "Enhancements to the csv module")

Verfasst: Dienstag 10. April 2007, 16:51
von Rebecca
Python Doku hat geschrieben:register_dialect(name[, dialect][, fmtparam])
Associate dialect with name. name must be a string or Unicode object. The dialect can be specified either by passing a sub-class of Dialect, or by fmtparam keyword arguments, or both, with keyword arguments overriding parameters of the dialect.
Ich will das schon gerne mit ner Klasse, da ich mehrere Formatparemeter angeben will. Aber ich hatte die Fehlermeldung falsch verstanden, ich dachte, das Problem liegt an dem self.quoting=... .

Aber er versteht beim register_dialect-Aufruf anscheinend nicht, dass es sich um eine dialect-klasse handelt und nicht um den quoting-Format-Parameter. Mmhh...

Code: Alles auswählen

class ExcelDe(csv.Dialect):
    def __init__(self):
        self.delimiter = ";"
        
csv.register_dialect("excel_de", dialect=ExcelDe)

Code: Alles auswählen

rbreu@zam285:~> python2.4 test.py
Traceback (most recent call last):
  File "test.py", line 8, in ?
    csv.register_dialect("excel_de", dialect=ExcelDe)
TypeError: register_dialect() takes no keyword arguments
rbreu@zam285:~> python2.5 test.py
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    csv.register_dialect("excel_de", dialect=ExcelDe)
TypeError: "quoting" must be an integer
Hilft auch nicht...

Verfasst: Dienstag 10. April 2007, 16:52
von Rebecca
YOGi: Ah, danke, das hatte ich gar nicht gesehen.