-
Notifications
You must be signed in to change notification settings - Fork 192
/
base.py
77 lines (57 loc) · 1.83 KB
/
base.py
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
67
68
69
70
71
72
73
74
75
76
77
# -*- coding: utf-8 -*-
from __future__ import division, print_function, absolute_import
import locale
import codecs
from petl.compat import izip_longest
from petl.util.base import Table
def getcodec(encoding):
if encoding is None:
encoding = locale.getpreferredencoding()
codec = codecs.lookup(encoding)
return codec
def fromcolumns(cols, header=None, missing=None):
"""View a sequence of columns as a table, e.g.::
>>> import petl as etl
>>> cols = [[0, 1, 2], ['a', 'b', 'c']]
>>> tbl = etl.fromcolumns(cols)
>>> tbl
+----+-----+
| f0 | f1 |
+====+=====+
| 0 | 'a' |
+----+-----+
| 1 | 'b' |
+----+-----+
| 2 | 'c' |
+----+-----+
If columns are not the same length, values will be padded to the length
of the longest column with `missing`, which is None by default, e.g.::
>>> cols = [[0, 1, 2], ['a', 'b']]
>>> tbl = etl.fromcolumns(cols, missing='NA')
>>> tbl
+----+------+
| f0 | f1 |
+====+======+
| 0 | 'a' |
+----+------+
| 1 | 'b' |
+----+------+
| 2 | 'NA' |
+----+------+
See also :func:`petl.io.json.fromdicts`.
.. versionadded:: 1.1.0
"""
return ColumnsView(cols, header=header, missing=missing)
class ColumnsView(Table):
def __init__(self, cols, header=None, missing=None):
self.cols = cols
self.header = header
self.missing = missing
def __iter__(self):
return itercolumns(self.cols, self.header, self.missing)
def itercolumns(cols, header, missing):
if header is None:
header = ['f%s' % i for i in range(len(cols))]
yield tuple(header)
for row in izip_longest(*cols, **dict(fillvalue=missing)):
yield row