是否有更pythonic的方式来跳过xlsx行?
我想要做的事:跳过A1:A6,跳过B1:B6,将剩下的保存到csv。 等价地,我想将A7: B+ws.max_row
保存为csv。
我的方法是:
for sheet_name in wb.get_sheet_names(): sheet = wb.get_sheet_by_name(sheet_name) col1 = [] cnt = 1 for i in sheet['A']: if cnt <= 6: cnt += 1 continue col1.append(i.value) col2 = [] cnt = 1 for i in sheet['B']: if cnt <= 6: cnt += 1 continue col2.append(i.value) data = zip(col1, col2) with open(str(sheet_name)+'.csv','wb') as out: csv_out=csv.writer(out) for row in data: csv_out.writerow(row)
我不喜欢我的方法: cnt
和手动selectA,然后selectB.(我想跳过A和B的完全相同的行数)
我的问题:是否有一个更pythonic方式跳过xlsx行?
openpyxl 2.4为工作表引入了iter_cols()
方法(注意,它不适用于只读工作表),以便您可以简单地执行类似
cols = {1:[], 2:[]} for idx, col in enumerate(ws.iter_cols(min_col=1, max_col=2, min_row=6), start=1): cols[idx] = [cell.value for cell in col]
请注意,请不要使用wb.get_sheet_names()
和wb.get_sheet_by_name()
因为这些方法已被弃用。 改用wb.sheetnames
和wb[sheetname]
。
对我来说,最简单的做法是从第7行开始逐行迭代,然后将每行写入CSV,然后不使用临时副本。 我不太了解OpenPyXL。 使用xlrd ,您的整个代码示例(包括在您的问题中的所有内容)将被表示为
for sheet_name in wb.sheet_names(): sheet = wb.sheet_by_name(sheet_name) with open(sheet_name + '.csv', 'wb') as out: csv_out = csv.writer(out) for rx in range(6, sheet.nrows): csv_out.writerow(sheet.row_values(rx, 0, 2))
(在最后一行中,如果整行只包含这两列,那么可以省略row_values()
最后两个参数。最后两个参数的作用类似于范围或切片中的开始和结束索引,开始包含和停止排他) 。
如果您确实需要将数据存储在临时副本中,则xlrd可让您方便地访问一列单元格:
data = zip(sheet.col_values(0, 6), sheet.col_values(1, 6))
col_values()
的第一个参数是列索引,第二个参数是起始行索引。 (如果需要在结束之前停止,则可以为停止行索引提供第三个参数,就像上面为row_values()
所做的row_values()
。