Excel工作表到Numpy数组

El *_*iño 2 python python-2.7 openpyxl

我正在尝试做一个令人难以置信的简单事情:将Excel工作表的一部分加载到Numpy数组中.我找到了一个有效的kludge,但它令人尴尬的是unpythonic:说我的工作表加载为"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
Run Code Online (Sandbox Code Playgroud)

将"ws"的内容加载到数组A.

必须有一个更优雅的方式来做到这一点.例如,csvread允许更自然地执行此操作,虽然我可以将.xlsx文件转换为csv文件,但使用openpyxl的整个目的是避免转换.那么我们就是强大的Intertubes的集体智慧:什么是更加琐碎的方式来执行这个概念上的微不足道的操作?

提前感谢您的回答.

PS:我通过Spyder在Mac上运行Python 2.7.5,是的,我确实阅读了openpyxl教程,这是我做到这一点的唯一原因.

pad*_*dyg 5

你可以做到

A = np.array([[i.value for i in j] for j in ws['C1':'E38']])
Run Code Online (Sandbox Code Playgroud)

编辑 - 进一步解释.(首先感谢我介绍openpyxl,我怀疑我会不时地使用它)

  1. 从工作表对象获取多个单元格的方法会生成一个生成器.如果您希望通过大型工作表工作,这可能会更有效,因为您可以立即开始而无需等待所有内容加载到列表中.
  2. 强制生成器制作您可以使用list(ws['C1':'E38'])的列表或上面的列表理解
  3. 每一行都是一个元组(即使只有一列宽)
  4. 细胞对象.它们有很多关于它们而不仅仅是一个数字,但如果你想获得数组的数字,你可以使用.value属性.这实际上是你的问题的关键,csv文件不包含excel电子表格的结构化信息.
  5. 没有(据我所知)用于从一系列单元格中提取值的内置方法,因此您必须在绘制出草图时有效地执行某些操作.

这样做的好处是:无需计算出数组的维度并使其成为空的,不需要计算出np数组的修正索引号,更快地列出推导.缺点是它需要以"A1"格式定义的"角落".如果范围不知道,那么你必须使用iter_rows,rows或columns

A = np.array([[i.value for i in j[2:5]] for j in ws.rows])
Run Code Online (Sandbox Code Playgroud)

如果您不知道有多少列,那么您将需要循环并检查更像您原始想法的值