web-dev-qa-db-fra.com

Comment copier dans la presse-papiers la sortie d'une cellule d'un cahier Jupyter?

Comment copier dans le presse-papiers la sortie d'une cellule d'un cahier Jupyter sans devoir la sélectionner par glisser-déposer?

 enter image description here

7

Le bloc-notes Jupyter s'exécute dans un navigateur afin que vous puissiez utiliser du javascript pour sélectionner et copier des cellules dans le presse-papiers. Après quelques essais et erreurs, je suis arrivé avec ce bookmarklet:

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

Ajoutez-le à vos favoris et exécutez-le sur une page de bloc-notes.

Comment ça marche

  1. Pour chaque entrée et sortie cellule, une petite icône de copie apparaît en survol.
  2. En cliquant sur l'icône Copier, le contenu de la cellule correspondante est sélectionné, envoyé dans le Presse-papiers, puis désélectionné. Le contenu est copié au format text/plain et text/html afin de pouvoir être utilisé pour copier du texte, des tableaux, des images et des graphiques avec mise en forme.
  3. Après avoir fait face, l’icône disparaît pour donner un retour d’information et s’affiche lors du prochain survol.

Il devrait fonctionner sur n'importe quel navigateur moderne, y compris IE11.

Voici la source décodée:

(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();
  });
}) ();

Bookmarklet est créé en supprimant les nouvelles lignes du code et en l'exécutant via la fonction encodeURIComponent().

Ancienne réponse

Il existe plusieurs façons de copier des données dans le Presse-papiers en python à l’aide de tkinter, win32 ou ctypes. Mais si vous utilisez un ordinateur portable Jupyter, vous utilisez probablement aussi des pandas.

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

Vous pouvez essayer d'utiliser pyperclip - un package tiers qui copie des chaînes dans le Presse-papiers du système.

Donné

import pyperclip as clip


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

Sortie

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

Code

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

Sortie 

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

J'utilise Jupyter Labs. Vous pouvez cliquer avec le bouton droit sur la cellule de sortie que vous souhaitez copier et sélectionner 

Créer une nouvelle vue pour la sortie . Cela mettra la sortie dans un écran séparé. Sur le nouvel écran de sortie, il vous permettra de copier en utilisant CRTL + C ou en utilisant un clic droit.

J'espère que cela t'aides.

0
cdon045