![](/img/trans.png)
[英]How to log outputs and errors to file without knowing where errors will occur
[英]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.