Как я могу скопировать в буфер обмена вывод ячейки в блокноте Jupyter, не выделяя его с помощью перетаскивания?
Как я могу скопировать в буфер обмена вывод ячейки в ноутбуке Jupyter?
Ответ 1
Блокнот 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
Добавьте его в закладки и запустите на странице записной книжки.
Как это устроено
- Для каждой ячейки ввода и вывода добавляется маленькая иконка копирования, которая отображается при наведении курсора.
- При нажатии на значок копирования выбирается соответствующий контент ячейки, отправляется в буфер обмена, а затем отменяет выбор. Содержимое копируется в формате text/plain и text/html, поэтому его можно использовать для копирования текста, таблиц, изображений и графиков с форматированием.
- После копирования значок исчезает, чтобы дать обратную связь, и показывает следующее событие при наведении.
Он должен работать на любом современном браузере, включая 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();
});
}) ();
Bookmarklet создается путем удаления новых строк из кода и запуска его через функцию encodeURIComponent()
.
Старый ответ
Есть несколько способов скопировать данные в буфер обмена в Python, используя tkinter, win32 или ctypes. Но если вы используете ноутбук Jupyter, вы, вероятно, также используете панд.
import pandas as pd
df = pd.DataFrame(['Copy me to clipboard'])
df.to_clipboard(index=False,header=False)
Ответ 2
Вы можете попробовать использовать 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)]
Ответ 3
Я использую Jupyter Labs. Вы можете щелкнуть правой кнопкой мыши ячейку вывода, которую хотите скопировать, и выбрать
Создать новый вид для вывода. Это выведет вывод на отдельный экран. На новом экране вывода он позволит вам копировать, используя CRTL + C или щелчок правой кнопкой мыши.
Надеюсь это поможет.