44 votes

Comment puis-je copier dans le presse-papiers la sortie d'une cellule dans un carnet Jupyter ?

Comment puis-je copier dans le presse-papiers la sortie d'une cellule dans un carnet Jupyter, sans avoir à la sélectionner par glisser-déposer ?

enter image description here

33voto

cps7 Points 456

Le carnet Jupyter s'exécute dans un navigateur, vous pouvez donc utiliser du javascript pour sélectionner et copier des cellules dans le presse-papiers. Après quelques essais et erreurs, je suis arrivé à 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 signets et exécutez-le sur une page de carnet de notes.

Comment cela fonctionne

  1. Pour chaque entrée y sortie La cellule ajoute une petite icône de copie qui s'affiche au survol.
  2. En cliquant sur l'icône de copie, on sélectionne le contenu de la cellule correspondante, on l'envoie dans le presse-papiers, puis on le désélectionne. Le contenu est copié dans texte/plain y texte/html Il peut donc être utilisé pour copier du texte, des tableaux, des images et des graphiques avec mise en forme.
  3. Après le copiage, l'icône disparaît pour donner du feedback et s'affiche au prochain survol.

Il devrait fonctionner sur tout 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();
  });
}) ();

Le Bookmarklet est créé en supprimant les nouvelles lignes du code et en le faisant passer par encodeURIComponent() fonction.

Ancienne réponse

Il existe plusieurs façons de copier des données dans le presse-papiers en python en utilisant tkinter, win32 ou ctypes. Mais si vous utilisez Jupyter notebook, vous utilisez probablement aussi pandas.

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

21voto

pylang Points 12013

Vous pouvez essayer d'utiliser pyperclip - un paquetage tiers qui copie les chaînes de caractères dans le presse-papiers du système.

Étant donné que

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)]

16voto

cdon045 Points 31

J'utilise Jupyter Labs. Vous pouvez faire un clic droit sur la cellule de sortie que vous voulez copier et sélectionner

Créer une nouvelle vue pour la sortie . Le résultat sera affiché dans un écran séparé. Sur le nouvel écran de sortie, vous pourrez copier en utilisant la fonction CRTL + C ou en utilisant le clic droit.

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X