openpyxl - FutureWarning:此方法的行为将在未来版本中更改。使用特定的 'len(elem)' 或 'elem is not None' 测试代替

ako*_*ndo 3 python python-3.x openpyxl future-warning

使用 openpyxl for python 加载 xlsm 文件时收到警告,然后在将一些数据添加到特定工作表中的特定 7 个单元格后保存/关闭它。问题是我收到了一个“FutureWarning”,我不知道它是关于什么的。我已经搜索了一段时间,但无法破译。

我怀疑 wb.save() 方法是触发此警告的原因,因为当我评论此特定行时它没有显示。

有谁知道这是什么?

代码

wb = openpyxl.load_workbook(filename=directory_path.xlsm, keep_vba=True)
ws = wb['sheetname']
ws.cell(row1, col1).value = ### (some number)
ws.cell(row2, col2).value = ### (some number)
ws.cell(row3, col3).value = ### (some number)
ws.cell(row4, col4).value = ### (some number)
ws.cell(row5, col5).value = ### (some number)
ws.cell(row6, col6).value = ### (some number)
ws.cell(row7, col7).value = ### (some number)
wb.save(directory_path.xlsm)
wb.close()
Run Code Online (Sandbox Code Playgroud)

警告信息

C:\Users\...\Anaconda3\lib\site-packages\openpyxl\comments\shape_writer.py:75: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead.
  if not shape_types:
Run Code Online (Sandbox Code Playgroud)

Ale*_*lor 5

Openpyxl似乎正在使用旧版本的lxml. 这是您的lxml.

shape_writer源代码的第 73-76 行是:

# check whether comments shape type already exists
shape_types = root.find("{%s}shapetype[@id='_x0000_t202']" % vmlns)
if not shape_types:
    self.add_comment_shapetype(root)
Run Code Online (Sandbox Code Playgroud)

问题是if not shape_types:. root.find()是对 的调用lxml。的文档lxml说:

在 ElementTree 1.3 和 lxml 2.0 之前,您还可以检查 Element 的真值以查看它是否有子元素,即子元素列表是否为空:

if root:   # this no longer works!
    print("The root element has children")
Run Code Online (Sandbox Code Playgroud)

这不再受支持,因为人们倾向于期望“某物”评估为 True 并期望 Elements 是“某物”,无论他们是否有孩子。因此,许多用户感到惊讶的是,任何 Element 在上述 if 语句中都会评估为 False。相反,使用 len(element),它更明确且不易出错。