CSV Dialect Example Requested - NEWBIE

Skip Montanaro skip at pobox.com
Tue Oct 28 11:10:43 EST 2003


    Doug> import csv

    Doug> import csv
    Doug> class dialect(csv.dialect):
    Doug>     delimiter = '|'
    Doug>     skipinitialspace = True
    Doug>     quotechar = '"'
    Doug>     doublequote = True

    Doug> reader = csv.reader(file("c:\\Temp\\test.csv"), dialect=dialect)
    Doug> for row in reader:
    Doug>      print row

Doug,

As others pointed out you want to subclass csv.Dialect.  It's probably
easier to subclass csv.excel instead though.  csv.Dialect is a base class
which doesn't define any of the required attributes.  If you subclass
csv.Dialect using just the attributes you indicated, you will get:

    >>> class dialect(csv.Dialect):
    ...   delimiter = '|'
    ...   skipinitialspace = True
    ...   quotechar = '"'
    ...   doublequote = True
    ... 
    >>> reader = csv.reader(file("support-list.csv"), dialect=dialect)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "/Users/skip/local/lib/python2.4/csv.py", line 39, in __init__
        raise Error, "Dialect did not validate: %s" % ", ".join(errors)
    _csv.Error: Dialect did not validate: lineterminator not set, quoting parameter not set

because csv.Dialect doesn't define a lineterminator attribute.  By
subclassing csv.excel you start out with a valid dialect and only need to
override the attributes which differ.

Here's a working example:

    >>> class dialect(csv.excel):
    ...   delimiter = '|'
    ...   skipinitialspace = True
    ...   quotechar = '"'
    ...   doublequote = True
    ... 
    >>> reader = csv.reader(file("support-list.csv"), dialect=dialect)
    >>> for row in reader:
    ...   print row
    ... 
    ['"', '1', '2', '3', '4']
    ['"Happy Days"', 'a', 'b', 'c', '4']

which uses

     """"|1|2|3|"4"
    """Happy Days"""|a|b|c|"4"

as the input file.

Here's an example of registering a dialect with the module:

    >>> csv.register_dialect("<wink>", dialect)
    >>> reader = csv.reader(file("support-list.csv"), dialect="<wink>")
    >>> for row in reader:
    ...   print row
    ... 
    ['"', '1', '2', '3', '4']
    ['"Happy Days"', 'a', 'b', 'c', '4']

Skip





More information about the Python-list mailing list