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 ?
Réponses
Trop de publicités?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
- Pour chaque entrée y sortie La cellule ajoute une petite icône de copie qui s'affiche au survol.
- 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.
- 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)
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)]
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.