如何将Jupyter笔记本中单元格的输出复制到剪贴板?

时间:2017-05-28 16:53:53

标签: python clipboard jupyter-notebook

如何将Jupyter笔记本中单元格的输出复制到剪贴板,而不必通过拖放选择它?

enter image description here

5 个答案:

答案 0 :(得分:9)

Jupyter笔记本在浏览器中运行,因此您可以使用一些javascript来选择并将单元格复制到剪贴板。经过一些反复试验后,我想出了这个书签:

javascript:(function%20()%20%7B%20function%20SelectText(element)%20%7B%20var%20range%3B%20var%20selection%3B%20if%20(document.body.createTextRange)%20%7B%20range%20%3D%20document.body.createTextRange()%3B%20range.moveToElementText(element)%3B%20range.select()%3B%20copy2clipboard(range.text%2C%20element.innerHTML)%3B%20document.getSelection().removeAllRanges()%3B%20%7D%20else%20if%20(window.getSelection)%20%7B%20selection%20%3D%20window.getSelection()%3B%20range%20%3D%20document.createRange()%3B%20range.selectNodeContents(element)%3B%20selection.removeAllRanges()%3B%20selection.addRange(range)%3B%20copy2clipboard(selection.toString()%2C%20element.innerHTML)%3B%20selection.removeAllRanges()%3B%20%7D%20%7D%3B%20function%20copy2clipboard(text%2C%20html)%20%7B%20function%20listener(e)%20%7B%20e.clipboardData.setData('text%2Fplain'%2C%20text)%3B%20e.clipboardData.setData('text%2Fhtml'%2C%20html)%3B%20e.preventDefault()%3B%20%7D%20document.addEventListener('copy'%2C%20listener)%3B%20document.execCommand('copy')%3B%20document.removeEventListener('copy'%2C%20listener)%3B%20%7D%3B%20%24('%23notebook-container').on('mouseenter'%2C%20'.input%2C%20.output_wrapper'%2C%20function%20()%20%7B%20if%20(%24(this).find('i%3Alast').length)%20%7B%20%24(this).find('i%3Alast').show()%3B%20%7D%20else%20%7B%20%24(this).css(%7B%20'position'%3A%20'relative'%20%7D).append(%24('%3Ci%20style%3D%22position%3Aabsolute%3B%20top%3A7px%3B%20left%3A%207px%3B%22%20class%3D%22fa-copy%20fa%22%3E%3C%2Fi%3E').on('click'%2C%20function%20()%20%7B%20SelectText(%24(this).parent().find('.input_area%2C%20.output')%20%5B0%5D)%3B%20%24(this).slideUp()%3B%20%7D))%3B%20%7D%20%7D)%3B%20%24('%23notebook-container').on('mouseleave'%2C%20'.input%2C%20.output_wrapper'%2C%20function%20()%20%7B%20%24(this).find('i%3Alast').hide()%3B%20%7D)%3B%20%7D)%20()%3B

将其添加到书签并在笔记本页面上运行。

如何运作

  1. 对于每个输入输出单元格,它会添加一个在悬停时显示的小复制图标。
  2. 单击复制图标可选择相应的单元格内容,将其发送到剪贴板,然后取消选择。内容以 text / plain text / html 格式复制,因此可用于复制带格式的文本,表格,图片和图表。
  3. 在应对之后,图标会消失,以提供一些反馈,并在下一个悬停事件中显示。
  4. 它适用于任何现代浏览器,包括IE11。

    这是解码来源:

    (function () {
      function SelectText(element) {
        var range;
        var selection;
        if (document.body.createTextRange) {
          range = document.body.createTextRange();
          range.moveToElementText(element);
          range.select();
          copy2clipboard(range.text, element.innerHTML);
          document.getSelection().removeAllRanges();
        } else if (window.getSelection) {
          selection = window.getSelection();
          range = document.createRange();
          range.selectNodeContents(element);
          selection.removeAllRanges();
          selection.addRange(range);
          copy2clipboard(selection.toString(), element.innerHTML);
          selection.removeAllRanges();
        }
      };
      function copy2clipboard(text, html) {
        function listener(e) {
          e.clipboardData.setData('text/plain', text);
          e.clipboardData.setData('text/html', html);
          e.preventDefault();
        }
        document.addEventListener('copy', listener);
        document.execCommand('copy');
        document.removeEventListener('copy', listener);
      };
      $('#notebook-container').on('mouseenter', '.input, .output_wrapper', function () {
        if ($(this).find('i:last').length) {
          $(this).find('i:last').show();
        } else {
          $(this).css({
            'position': 'relative'
          }).append($('<i style=\"position:absolute; top:7px; left: 7px;\" class=\"fa-copy fa\"></i>').on('click', function () {
            SelectText($(this).parent().find('.input_area, .output') [0]);
            $(this).slideUp();
          }));
        }
      });
      $('#notebook-container').on('mouseleave', '.input, .output_wrapper', function () {
        $(this).find('i:last').hide();
      });
    }) ();
    

    通过从代码中删除换行符并通过encodeURIComponent()函数运行它来创建Bookmarklet。

    旧答案

    有几种方法可以使用tkinter,win32或ctypes在python中将数据复制到剪贴板。但是,如果您使用的是Jupyter笔记本,您可能还使用了pandas。

    import pandas as pd
    df = pd.DataFrame(['Copy me to clipboard'])
    df.to_clipboard(index=False,header=False)
    

答案 1 :(得分:3)

您可以尝试使用pyperclip-将字符串复制到系统剪贴板的第三方程序包。

给出

import pyperclip as clip


# Sample Data
res = [(str(x*100), x) for x in range(1, 10)]
res

输出

[('100', 1), ('200', 2), ('300', 3),
 ('400', 4), ('500', 5), ('600', 6), 
 ('700', 7), ('800', 8), ('900', 9)]

代码

clip.copy(f"{res}")
#clip.copy("{}".format(res))                           # python < 3.6
clip.paste()                                           # or Ctrl + V

输出

[('100', 1), ('200', 2), ('300', 3),
 ('400', 4), ('500', 5), ('600', 6),
 ('700', 7), ('800', 8), ('900', 9)]

答案 2 :(得分:3)

我使用Jupyter Labs。您可以右键单击要复制的输出单元,然后选择

为输出创建新视图。这样会将输出放在单独的屏幕中。在新的输出屏幕上,您可以使用 CRTL + C 或单击鼠标右键进行复制。

希望这会有所帮助。

答案 3 :(得分:0)

在下面的示例中,不输出实际文本(尽管如果更改了函数的第6行,则可能会输出文本),而是显示单行确认剪贴板上已提供多行内容。

all_data_str是一个字符串,其内容将在剪贴板上可用,编写您自己的名为dump_data_array的生成函数。

当用户单击调用该功能的按钮时,将触发粘贴操作:

def on_button_clipboard(b):
    out_data.clear_output()
    all_data_str=dump_data_array(da)
    with out_data:
        lineCount=all_data_str.count('\n')-1;
        html_div = '<div id="pasting_to_clipboard">'+str(lineCount)+' lines pasted, you can now ^V into Excel</div>'
        display(HTML(html_div))
        js = """<script>
function copyToClipboard(text) {
    var dummy = document.createElement("textarea");
    document.body.appendChild(dummy);
    dummy.value = text;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);
}
        </script>"""
        display(HTML(js))
        js2 = "<script>copyToClipboard(`" + all_data_str + "`);</script>"
        display(HTML(js2))

答案 4 :(得分:0)

在Ubuntu 19.10 / Firefox浏览器上,我可以通过连续单击3次来整体选择输出单元格内容,然后照常复制 CTRL + C