如何将Numpy数组粘贴到Excel中
我有很多文件需要用Numpy和SciPy来处理,但最后我得把结果做成一个Excel文件。请问有什么好办法可以把一个很大的numpy数组高效地复制粘贴到Excel里呢?
我试过把数组转换成Pandas的DataFrame对象,因为它有一个非常好用的功能 to_clipboard(excel=True)
,可以直接复制到剪贴板。但我发现我花了太多时间在把数组转换成DataFrame上。
我不能简单地把数组写成CSV文件然后再用Excel打开,因为我需要把数组添加到一个已经存在的文件里;这用xlrd/xlwt和其他Excel工具来实现非常困难。
6 个回答
我对PhilMacKay的回答进行了扩展,增加了以下内容:
- 支持一维数组
- 允许使用逗号作为小数点分隔符(小数点用","表示)
import win32clipboard as clipboard
def to_clipboard(array, decimal=","):
"""
Copies an array into a string format acceptable by Excel.
Columns separated by \t, rows separated by \n
"""
# Create string from array
try:
n, m = np.shape(array)
except ValueError:
n, m = 1, 0
line_strings = []
if m > 0:
for line in array:
if decimal == ",":
line_strings.append("\t".join(line.astype(str)).replace(
"\n","").replace(".", ","))
else:
line_strings.append("\t".join(line.astype(str)).replace(
"\n",""))
array_string = "\r\n".join(line_strings)
else:
if decimal == ",":
array_string = "\r\n".join(array.astype(str)).replace(".", ",")
else:
array_string = "\r\n".join(array.astype(str))
# Put string into clipboard (open, clear, set, close)
clipboard.OpenClipboard()
clipboard.EmptyClipboard()
clipboard.SetClipboardText(array_string)
clipboard.CloseClipboard()
截至今天,你还可以使用 xlwings。这个工具是开源的,完全可以和Numpy数组以及Pandas数据框一起使用。
如果我需要处理多个加载到Python中的文件,然后把它们转换成Excel格式,我可能会使用一些工具,比如xlwt。
话说回来,我想分享一下我的方法,将Python数据粘贴到电子表格中,欢迎大家提出修改意见、投诉或反馈。这个方法不依赖任何第三方库,应该可以在不同的操作系统上使用。
import pandas as pd
pd.DataFrame(arr).to_clipboard()
我觉得用pandas这个包是最简单的方法之一。
我觉得最好的办法是把数组变成一个字符串,然后用 win32clipboard
把它发送到剪贴板。虽然这个方法不能在所有平台上使用,但其实Excel本身也不是在每个平台上都有的。
Excel用制表符(\t
)来表示列的变化,用 \r\n
来表示行的变化。
相关的代码如下:
import win32clipboard as clipboard
def toClipboardForExcel(array):
"""
Copies an array into a string format acceptable by Excel.
Columns separated by \t, rows separated by \n
"""
# Create string from array
line_strings = []
for line in array:
line_strings.append("\t".join(line.astype(str)).replace("\n",""))
array_string = "\r\n".join(line_strings)
# Put string into clipboard (open, clear, set, close)
clipboard.OpenClipboard()
clipboard.EmptyClipboard()
clipboard.SetClipboardText(array_string)
clipboard.CloseClipboard()
我用形状为 (1000,10000) 的随机数组测试过这个代码,最大的瓶颈似乎是在把数据传递给函数的时候。(当我在函数开始时加一个 print
语句时,我还是得等一会儿才能看到任何输出。)
编辑:上面那段话是我在Visual Studio的Python工具中遇到的情况。在这个环境下,打印语句似乎有延迟。而在直接的命令行界面中,瓶颈就像预期的那样出现在循环里。