有没有更pythonic的方法来跳过xlsx中的行?
Is there a more pythonic way to skip rows in 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
并手动选择 A,然后选择 B。(我想跳过 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()
所做的那样。)
我想做的事情:
跳过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
并手动选择 A,然后选择 B。(我想跳过 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()
所做的那样。)