Mercurial > hg > numerics
comparison numerics/cat_columns.py @ 62:18c0820bfe12
stub concatenating columns
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Mon, 23 Feb 2015 10:50:13 -0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
61:82a18c9337c3 | 62:18c0820bfe12 |
---|---|
1 #!/usr/bin/env python | |
2 # -*- coding: utf-8 -*- | |
3 | |
4 """ | |
5 output columns of various CSV files | |
6 | |
7 Example:: | |
8 | |
9 > cat-columns foo.csv:0 bar.csv:1,2,3 fleem.csv | |
10 | |
11 This will generate CSV output with the first column from `foo.csv`, | |
12 the 2nd, 3rd, and 4th columns from `bar.csv`, | |
13 and all columns from `fleem.csv`. | |
14 """ | |
15 | |
16 # imports | |
17 import argparse | |
18 import csv | |
19 import os | |
20 import sys | |
21 import time | |
22 from collections import OrderedDict | |
23 from .read import read_csv | |
24 | |
25 # module globals | |
26 __all__ = ['cat_columns', 'CatColumnParser', 'main'] | |
27 | |
28 def cat_columns(csv_files): | |
29 """ | |
30 csv_files -- an iterable of 2-tuples of `path`, columns | |
31 """ | |
32 | |
33 rows = [] | |
34 | |
35 class CatColumnParser(argparse.ArgumentParser): | |
36 """CLI option parser""" | |
37 def __init__(self, **kwargs): | |
38 kwargs.setdefault('formatter_class', argparse.RawTextHelpFormatter) | |
39 kwargs.setdefault('description', __doc__) | |
40 argparse.ArgumentParser.__init__(self, **kwargs) | |
41 self.add_argument('csv', nargs='+', | |
42 help="path to CSV files and columns to output, delimited by ':' and comma-separated") | |
43 self.add_argument('-o', '--output', dest='output', | |
44 type=argparse.FileType('a'), default=sys.stdout, | |
45 help="where to output to, or stdout by default") | |
46 self.options = None | |
47 | |
48 def parse_args(self, *args, **kw): | |
49 options = argparse.ArgumentParser.parse_args(self, *args, **kw) | |
50 self.validate(options) | |
51 self.options = options | |
52 return options | |
53 | |
54 def validate(self, options): | |
55 """validate options""" | |
56 | |
57 def main(args=sys.argv[1:]): | |
58 """CLI""" | |
59 | |
60 # parse command line options | |
61 parser = CatColumnParser() | |
62 options = parser.parse_args(args) | |
63 | |
64 # get the data | |
65 csv_files = OrderedDict() | |
66 missing = [] | |
67 for item in options.csv: | |
68 if ':' in item: | |
69 path, columns = item.rsplit(':', 1) | |
70 columns = columns.strip() | |
71 if columns: | |
72 columns = [int(column) for column in columns.split(',')] | |
73 else: | |
74 columns = None | |
75 else: | |
76 path = item | |
77 columns = None | |
78 if not os.path.exists(path): | |
79 missing.append(path) | |
80 if missing: | |
81 parser.error("File(s) not found:\n{}".format('\n'.join(missing))) | |
82 | |
83 # concatenate the rows | |
84 data = cat_columns(csv_files.items()) | |
85 | |
86 # output it | |
87 writer = csv.writer(options.output) | |
88 for row in data: | |
89 writer.write_row(row) | |
90 options.output.flush() | |
91 | |
92 if __name__ == '__main__': | |
93 main() | |
94 | |
95 |