我正在尝试做一件令人难以置信的简单事情:将 Excel 工作表的部分内容加载到 Numpy 数组中。我发现了一个有用的拼凑,但它令人尴尬地不Pythonic:
假设我的工作表被加载为“ws”,代码:
A = np.zeros((37,3))
for i in range(2,39):
for j in range(1,4):
A[i-2,j-1]= ws.cell(row = i, column = j).value
将“ws”的内容加载到数组 A 中。
必须有一种更优雅的方法来做到这一点。例如,csvread 允许更自然地执行此操作,虽然我可以很好地将 .xlsx 文件转换为 csv 文件,但使用 openpyxl 的全部目的是避免这种转换。那么,我们就到了,强大的管间的集体智慧:有什么更 Pythonic 的方法来执行这个概念上微不足道的操作?
预先感谢您的答复。
PS:我通过 Spyder 在 Mac 上运行 Python 2.7.5,是的,我确实阅读了 openpyxl 教程,这是我到目前为止的唯一原因。
你可以做
A = np.array([[i.value for i in j] for j in ws['C1':'E38']])
编辑-进一步解释。
(首先感谢您向我介绍 openpyxl,我怀疑我会不时地使用它)
- 从工作表对象获取多个单元格的方法会生成一个生成器。如果您想处理一张大工作表,这可能会更有效,因为您可以立即开始,而无需等待将其全部加载到列表中。
- 要强制生成器创建一个列表,您可以使用
list(ws['C1':'E38'])
或上面的列表理解
- 每行都是一个元组(即使只有一列宽)
- 细胞对象。这些不仅仅是一个数字,还有更多的信息,但如果您想获取数组的数字,您可以使用 .value 属性。这确实是您问题的关键,csv 文件不包含 Excel 电子表格的结构化信息。
- (据我所知)没有用于从一系列单元格中提取值的内置方法,因此您必须按照您所描绘的方式有效地执行某些操作。
按照我的方式这样做的优点是:不需要计算出数组的维数并从一个空数组开始,不需要计算出 np 数组的正确索引号,列表推导速度更快。缺点是它需要以“A1”格式定义“角”。如果不知道范围,则必须使用 iter_rows、行或列
A = np.array([[i.value for i in j[2:5]] for j in ws.rows])
如果您不知道有多少列,那么您将不得不循环并检查更像您最初想法的值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)