如何将Numpy数组粘贴到Excel中

7 投票
6 回答
22921 浏览
提问于 2025-04-17 22:51

我有很多文件需要用Numpy和SciPy来处理,但最后我得把结果做成一个Excel文件。请问有什么好办法可以把一个很大的numpy数组高效地复制粘贴到Excel里呢?

我试过把数组转换成Pandas的DataFrame对象,因为它有一个非常好用的功能 to_clipboard(excel=True),可以直接复制到剪贴板。但我发现我花了太多时间在把数组转换成DataFrame上。

我不能简单地把数组写成CSV文件然后再用Excel打开,因为我需要把数组添加到一个已经存在的文件里;这用xlrd/xlwt和其他Excel工具来实现非常困难。

6 个回答

0

我对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()
1

截至今天,你还可以使用 xlwings。这个工具是开源的,完全可以和Numpy数组以及Pandas数据框一起使用。

1

如果我需要处理多个加载到Python中的文件,然后把它们转换成Excel格式,我可能会使用一些工具,比如xlwt

话说回来,我想分享一下我的方法,将Python数据粘贴到电子表格中,欢迎大家提出修改意见、投诉或反馈。这个方法不依赖任何第三方库,应该可以在不同的操作系统上使用。

9
    import pandas as pd
    pd.DataFrame(arr).to_clipboard()

我觉得用pandas这个包是最简单的方法之一。

14

我觉得最好的办法是把数组变成一个字符串,然后用 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工具中遇到的情况。在这个环境下,打印语句似乎有延迟。而在直接的命令行界面中,瓶颈就像预期的那样出现在循环里。

撰写回答