繁体   English   中英

OpenPyXL - 只读:如何在不知道何时发生的情况下跳过空行?

[英]OpenPyXL - ReadOnly: How to skip empty rows without knowing when they occur?

我对编程很陌生,所以如果我的代码不好并且答案太明显,请多多包涵。 :)

我想将 excel 文件解析到一个目录中,以便以后可以通过密钥访问它们。 在解析之前,我不知道 excel 文件的结构。 所以我不能只是这样编码来跳过某个空行,因为它们是随机的。 为此,我使用 Python 3 和 OpenPyXl(只读)。 这是我的代码:

from openpyxl import load_workbook
import pprint


# path to file
c = "test.xlsx"
wb = load_workbook(filename=c, read_only=True, data_only=True)

# key for directory
data = {}
# list of worksheet names
wsname = []
# values in rows per worksheet
valuename = []


# took this odd numbers since pprint organizes the numbers weird when 1s and 10s are involved
# counter for row
k = 9
# counter for column
i = 10

# splits name of xlsx - file from .xlsx
workbook = c.split(".")[0]

data[workbook] = {}
for ws in wb.worksheets:
    # takes worksheet name and parses it into the wsname list
    wsname.append(ws.title)
    wsrealname = wsname.pop()
    worksheet = wsrealname
    data[workbook][worksheet] = {}
    for row in ws.rows:
        k += 1
        for cell in row:
            # reads value per row and column
            data[workbook][worksheet]["Row: " + str(k) + " Column: " + str(i)] = cell.value
            i += 1
        i = 10
    k = 9

pprint.pprint(data)

有了这个我得到 output 像这样:

    {'test': {'Worksheet1': {'Row: 10 Column: 10': None,
                             'Row: 10 Column: 11': None,
                             'Row: 10 Column: 12': None,
                             'Row: 10 Column: 13': None,
                             'Row: 11 Column: 10': None,
                             'Row: 11 Column: 11': 'Test1',
                             'Row: 11 Column: 12': None,
                             'Row: 11 Column: 13': None}}}

这是我想要的 Output,尽管事实上我想在这个例子中跳过整个第 10 行,因为所有值都是 None 因此为空。

如前所述,我不知道什么时候会出现空行,所以我不能硬编码要跳过的某一行。 在只读模式下,如果您打印(行),则行中将只有“EmptyCell”,如下所示:

(<EmptyCell>, <EmptyCell>, <EmptyCell>, <EmptyCell>)

我试图让我的程序用 set() 检查“值”行中是否有重复项。

if len(set(row)) == 1:
.....

但这并不能解决此问题,因为我收到此错误消息:

TypeError: unhashable type: 'ReadOnlyCell'

如果我将 cell.value 与“无”进行比较并排除所有“无”,我会得到这个 Output:

{'test': {'Worksheet1': {'Row: 11 Column: 11': 'Test1'}}}

这是没有好处的,因为如果整行为空,我只想跳过单元格。 Output 应该是这样的:

{'test': {'Worksheet1': {'Row: 11 Column: 10': None,
                     'Row: 11 Column: 11': 'Test1',
                     'Row: 11 Column: 12': None,
                     'Row: 11 Column: 13': None}}}

那么,您能否帮助弄清楚仅当完整行(以及所有单元格)为空时如何跳过单元格?

非常感谢!

from openpyxl.cell.read_only import EmptyCell

for row in ws:
     empty = all(isinstance(cell, EmptyCell) for cell in row) # or check if the value is None

注意 在只读模式下,请避免多次调用,例如data[workbook][worksheet]['A1']因为它们将迫使库一次又一次地解析data[workbook][worksheet]['A1']

只需创建您的自定义生成器,它只会产生非空行:

def iter_rows_with_data(worksheet):
    for row in worksheet.iter_rows(values_only=True):
        if any(row):
            yield row

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM