File: read.py

package info (click to toggle)
python-clevercsv 0.7.5%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 872 kB
  • sloc: python: 5,076; ansic: 763; makefile: 81
file content (66 lines) | stat: -rw-r--r-- 1,945 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# -*- coding: utf-8 -*-

"""
Drop-in replacement for the Python csv reader class. This is a wrapper for the 
Parser class, defined in :mod:`cparser`.

Author: Gertjan van den Burg

"""

import csv

from . import field_size_limit
from .cparser import Error as ParserError
from .cparser import Parser
from .dialect import SimpleDialect
from .exceptions import Error


class reader(object):
    def __init__(self, csvfile, dialect="excel", **fmtparams):
        self.csvfile = csvfile
        self.original_dialect = dialect
        self.dialect = self._make_simple_dialect(dialect, **fmtparams)
        self.line_num = 0
        self.parser_gen = None

    def _make_simple_dialect(self, dialect, **fmtparams):
        if isinstance(dialect, str):
            sd = SimpleDialect.from_csv_dialect(csv.get_dialect(dialect))
        elif isinstance(dialect, csv.Dialect):
            sd = SimpleDialect.from_csv_dialect(dialect)
        elif isinstance(dialect, SimpleDialect):
            sd = dialect
        else:
            raise ValueError("Unknown dialect type: %r" % dialect)
        for key, value in fmtparams.items():
            if key in ["delimiter", "quotechar", "escapechar", "strict"]:
                setattr(sd, key, value)
        sd.validate()
        return sd

    def __iter__(self):
        self.parser_gen = Parser(
            self.csvfile,
            delimiter=self.dialect.delimiter,
            quotechar=self.dialect.quotechar,
            escapechar=self.dialect.escapechar,
            field_limit=field_size_limit(),
            strict=self.dialect.strict,
        )
        return self

    def __next__(self):
        if self.parser_gen is None:
            self.__iter__()
        try:
            row = next(self.parser_gen)
        except ParserError as e:
            raise Error(str(e))
        self.line_num += 1
        return row

    def next(self):
        # for python 2
        return self.__next__()