Coverage for /home/martinb/.local/share/virtualenvs/camcops/lib/python3.6/site-packages/pyexcel_io/reader.py : 28%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from pyexcel_io.sheet import SheetReader
2from pyexcel_io.plugins import NEW_READERS
3from pyexcel_io._compact import OrderedDict
6def clean_keywords(keywords):
7 sheet_keywords = {}
8 native_sheet_keywords = {}
9 args_list = [
10 "start_row",
11 "row_limit",
12 "start_column",
13 "column_limit",
14 "skip_column_func",
15 "skip_row_func",
16 "skip_empty_rows",
17 "row_renderer",
18 "keep_trailing_empty_cells",
19 ]
20 for arg in keywords:
21 if arg in args_list:
22 sheet_keywords[arg] = keywords[arg]
23 else:
24 native_sheet_keywords[arg] = keywords[arg]
25 return sheet_keywords, native_sheet_keywords
28class Reader(object):
29 def __init__(self, file_type, library=None):
30 self.file_type = file_type
31 self.library = library
32 self.keywords = None
34 # if you know which reader class to use, this attribute allows
35 # you to set reader class externally. Since there is no
36 # so call private field in Python, I am not going to create
37 # useless setter and getter functions like Java.
38 # in pyexcel, this attribute is mainly used for testing
39 self.reader_class = None
41 def open(self, file_name, **keywords):
42 if self.reader_class is None:
43 self.reader_class = NEW_READERS.get_a_plugin(
44 self.file_type, location="file", library=self.library
45 )
46 self.keywords, native_sheet_keywords = clean_keywords(keywords)
47 self.reader = self.reader_class(
48 file_name, self.file_type, **native_sheet_keywords
49 )
50 return self.reader
52 def open_content(self, file_content, **keywords):
53 self.keywords, native_sheet_keywords = clean_keywords(keywords)
54 if self.reader_class is None:
55 self.reader_class = NEW_READERS.get_a_plugin(
56 self.file_type, location="content", library=self.library
57 )
58 self.reader = self.reader_class(
59 file_content, self.file_type, **native_sheet_keywords
60 )
61 return self.reader
63 def open_stream(self, file_stream, **keywords):
64 self.keywords, native_sheet_keywords = clean_keywords(keywords)
65 if self.reader_class is None:
66 self.reader_class = NEW_READERS.get_a_plugin(
67 self.file_type, location="memory", library=self.library
68 )
69 self.reader = self.reader_class(
70 file_stream, self.file_type, **native_sheet_keywords
71 )
72 return self.reader
74 def read_sheet_by_name(self, sheet_name):
75 """
76 read a named sheet from a excel data book
77 """
78 sheet_names = self.reader.sheet_names()
79 index = sheet_names.index(sheet_name)
81 return self.read_sheet_by_index(index)
83 def read_sheet_by_index(self, sheet_index):
84 sheet_reader = self.reader.read_sheet(sheet_index)
85 sheet_names = self.reader.sheet_names()
86 sheet = EncapsulatedSheetReader(sheet_reader, **self.keywords)
87 return {sheet_names[sheet_index]: sheet.to_array()}
89 def read_all(self):
90 """
91 read everything from a excel data book
92 """
93 result = OrderedDict()
94 for sheet_index in range(len(self.reader)):
95 content_dict = self.read_sheet_by_index(sheet_index)
96 result.update(content_dict)
97 return result
99 def read_many(self, sheets):
100 """
101 read everything from a excel data book
102 """
103 result = OrderedDict()
104 for sheet in sheets:
105 if isinstance(sheet, int):
106 result.update(self.read_sheet_by_index(sheet))
107 else:
108 result.update(self.read_sheet_by_name(sheet))
109 return result
111 def close(self):
112 return self.reader.close()
114 def __enter__(self):
115 return self
117 def __exit__(self, a_type, value, traceback):
118 self.close()
121class EncapsulatedSheetReader(SheetReader):
122 def row_iterator(self):
123 yield from self._native_sheet.row_iterator()
125 def column_iterator(self, row):
126 yield from self._native_sheet.column_iterator(row)