Hide keyboard shortcuts

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 

4 

5 

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 

26 

27 

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 

33 

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 

40 

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 

51 

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 

62 

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 

73 

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) 

80 

81 return self.read_sheet_by_index(index) 

82 

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()} 

88 

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 

98 

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 

110 

111 def close(self): 

112 return self.reader.close() 

113 

114 def __enter__(self): 

115 return self 

116 

117 def __exit__(self, a_type, value, traceback): 

118 self.close() 

119 

120 

121class EncapsulatedSheetReader(SheetReader): 

122 def row_iterator(self): 

123 yield from self._native_sheet.row_iterator() 

124 

125 def column_iterator(self, row): 

126 yield from self._native_sheet.column_iterator(row)