簡體   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