是否有更多pythonic方法可以跳过xlsx中的行?

时间:2016-10-28 01:04:49

标签: python excel csv openpyxl

我想做什么: 跳过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中的行?

2 个答案:

答案 0 :(得分:3)

对我来说,最简单的事情就是简单地从第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()所做的那样。)

答案 1 :(得分:2)

openpyxl 2.4为工作表引入了iter_cols()方法(NB。它不适用于只读工作表),因此您可以简单地执行类似

的操作
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.sheetnameswb[sheetname]