Mercurial > repos > adam-novak > hexagram
comparison hexagram-6ae12361157c/hexagram/tsv.py @ 0:1407e3634bcf draft default tip
Uploaded r11 from test tool shed.
author | adam-novak |
---|---|
date | Tue, 22 Oct 2013 14:17:59 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1407e3634bcf |
---|---|
1 #!/usr/bin/env python2.7 | |
2 # tsv.py: a module for writing TSV (tab-separated value) files | |
3 """ | |
4 This module defines two classes: a TsvWriter, which can be constructed on a | |
5 stream to allow writing TSV data lines and #-delimited comments to that stream, | |
6 and a TsvReader, which can be constructed on a stream and iterated over to | |
7 obtain lists of the values from each non-comment line in the stream. | |
8 | |
9 TSV is most useful as the basis for other, more tightly specified file formats. | |
10 | |
11 """ | |
12 | |
13 class TsvWriter(object): | |
14 """ | |
15 Represents a writer for tab-separated value files containing #-delimited | |
16 comments. | |
17 | |
18 """ | |
19 def __init__(self, stream): | |
20 """ | |
21 Make a new TsvWriter for writing TSV data to the given stream. | |
22 """ | |
23 | |
24 # This holds the stream | |
25 self.stream = stream | |
26 | |
27 | |
28 def line(self, *args): | |
29 """ | |
30 Write the given values to the file, as a TSV line. Args holds a list of | |
31 all arguments passed. Any argument that stringifies to a string legal as | |
32 a TSV data item can be written. | |
33 | |
34 """ | |
35 | |
36 self.list_line(args) | |
37 | |
38 | |
39 def list_line(self, line): | |
40 """ | |
41 Write the given iterable of values (line) to the file as items on the | |
42 same line. Any argument that stringifies to a string legal as a TSV data | |
43 item can be written. | |
44 | |
45 Does not copy the line or build a big string in memory. | |
46 """ | |
47 | |
48 if len(line) == 0: | |
49 return | |
50 | |
51 self.stream.write(str(line[0])) | |
52 | |
53 for item in line[1:]: | |
54 self.stream.write("\t") | |
55 self.stream.write(str(item)) | |
56 | |
57 self.stream.write("\n") | |
58 | |
59 def comment(self, text): | |
60 """ | |
61 Write the given text as a TSV comment. text must be a string containing | |
62 no newlines. | |
63 | |
64 """ | |
65 | |
66 self.stream.write("# {}\n".format(text)) | |
67 | |
68 def close(self): | |
69 """ | |
70 Close the underlying stream. | |
71 """ | |
72 | |
73 self.stream.close() | |
74 | |
75 class TsvReader(object): | |
76 """ | |
77 Represents a reader for tab-separated value files. Skips over comments | |
78 starting with #. Can be iterated over. | |
79 | |
80 Field values consisting of only whitespace are not allowed. | |
81 """ | |
82 | |
83 def __init__(self, stream): | |
84 """ | |
85 Make a new TsvReader to read from the given stream. | |
86 """ | |
87 | |
88 self.stream = stream | |
89 | |
90 def __iter__(self): | |
91 """ | |
92 Yields lists of all fields on each line, as strings, until all lines are | |
93 exhausted. Strips whitespace around field contents. | |
94 """ | |
95 | |
96 for line in self.stream: | |
97 line = line.strip() | |
98 if line == "" or line[0] == "#": | |
99 # Skip comments and empty lines | |
100 continue | |
101 | |
102 yield map(str.strip, line.split("\t")) | |
103 | |
104 def close(self): | |
105 """ | |
106 Close the underlying stream. | |
107 """ | |
108 | |
109 self.stream.close() |