Как прочитать текст из буфера обмена?

Как прочитать текст из буфера обмена (windows) с помощью Python?

Относится к этот вопрос.

glglgl 15.11.2012 17:48

в моем случае работал только ответ дан, который использует пакет буфер обмена.

Soorena 09.10.2016 16:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
103
2
109 227
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Попробуйте win32clipboard из пакета win32all (который, вероятно, установлен, если вы используете ActiveState Python).

См. Образец здесь: http://code.activestate.com/recipes/474121/

Ответ принят как подходящий

Вы можете использовать модуль win32clipboard, который является частью pywin32.

Вот пример, который сначала устанавливает данные буфера обмена, а затем получает их:

import win32clipboard

# set clipboard data
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText('testing 123')
win32clipboard.CloseClipboard()

# get clipboard data
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
print data

Важное напоминание из документации:

When the window has finished examining or changing the clipboard, close the clipboard by calling CloseClipboard. This enables other windows to access the clipboard. Do not place an object on the clipboard after calling CloseClipboard.

Вы знаете, можно ли использовать оператор «with»?

Norfeldt 11.07.2013 18:21

Стоит отметить, что в py34, win7 SetClipboardText не работал без предшествующего вызова EmptyClipboard.

CoderTao 13.01.2015 00:57

Этот модуль полезен, если вы хотите выполнять более сложные операции, например. извлечение содержимого в формате HTML из буфера обмена. См. stackoverflow.com/questions/17298897/…

xji 08.09.2016 11:23

@Norfeldt Если нет собственного способа, вы можете легко создать свой собственный настраиваемый объект, который поддерживает "with"

Elijas Dapšauskas 28.06.2018 21:38

Не работает, если я пытался скопировать многострочный текст с помощью строковой переменной, определенной с помощью "" "

Slowaways 07.12.2020 00:19

Я видел много предложений по использованию модуля win32, но Tkinter предоставляет самый короткий и простой метод, который я видел, как в этом посте: Как скопировать строку в буфер обмена в Windows с помощью Python?

Кроме того, Tkinter входит в стандартную библиотеку Python.

Некоторый код, который получит значение буфера обмена через Tkinter: from Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()

mgkrebbs 08.01.2014 04:42

Ответ, получивший наибольшее количество голосов выше, странен в том смысле, что он просто очищает буфер обмена, а затем получает содержимое (которое затем становится пустым). Можно очистить буфер обмена, чтобы быть уверенным, что некоторый тип содержимого буфера обмена, такой как «форматированный текст», не «покрывает» ваше обычное текстовое содержимое, которое вы хотите сохранить в буфере обмена.

Следующий фрагмент кода заменяет все новые строки в буфере обмена пробелами, затем удаляет все двойные пробелы и, наконец, сохраняет содержимое обратно в буфер обмена:

import win32clipboard

win32clipboard.OpenClipboard()
c = win32clipboard.GetClipboardData()
win32clipboard.EmptyClipboard()
c = c.replace('\n', ' ')
c = c.replace('\r', ' ')
while c.find('  ') != -1:
    c = c.replace('  ', ' ')
win32clipboard.SetClipboardText(c)
win32clipboard.CloseClipboard()

Если вы не хотите устанавливать дополнительные пакеты, ctypes тоже справится с этой задачей.

import ctypes

CF_TEXT = 1

kernel32 = ctypes.windll.kernel32
kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
kernel32.GlobalLock.restype = ctypes.c_void_p
kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
user32 = ctypes.windll.user32
user32.GetClipboardData.restype = ctypes.c_void_p

def get_clipboard_text():
    user32.OpenClipboard(0)
    try:
        if user32.IsClipboardFormatAvailable(CF_TEXT):
            data = user32.GetClipboardData(CF_TEXT)
            data_locked = kernel32.GlobalLock(data)
            text = ctypes.c_char_p(data_locked)
            value = text.value
            kernel32.GlobalUnlock(data_locked)
            return value
    finally:
        user32.CloseClipboard()

print(get_clipboard_text())

Похоже, это не работает в Windows 10. Он всегда печатает «Нет».

Aran-Fey 01.01.2019 11:33

Windows 10 отлично работала у меня, пока я использовал 32-разрядную версию Python. Я обновил ответ для работы с 64-битной версией.

kichik 02.01.2019 07:12

перейти к этой ошибке "ожидаемый указатель char, получил int" в строке "text = ctypes.c_char_p (data_locked)", любая идея?

txemsukr 08.08.2019 15:34

Было бы здорово увидеть подобное решение и для копирования текста в буфер обмена.

mrkbutty 02.10.2019 17:23

какие-нибудь советы по перечислению дополнительных доступных форматов буфера обмена? Возможно получение двоичных / файловых данных?

sytech 19.01.2021 05:22

вы можете легко сделать это с помощью встроенного модуля Ткинтер, который в основном представляет собой библиотеку графического интерфейса. Этот код создает пустой виджет для получения содержимого буфера обмена из ОС.

from tkinter import Tk  # Python 3
#from Tkinter import Tk # for Python 2.x
Tk().clipboard_get()

Пожалуйста, добавьте комментарий к этому коду и (возможно) ссылки на полезную документацию.

jb. 24.05.2014 16:27

должен быть tkinter вместо Tkinter. В противном случае это не сработало на моем python 3.7.3 64bit win10.

jerik 29.04.2019 10:51

Намного лучше, чем пытаться установить pywin32, так как у этого есть ряд известных проблем. Хорошая подсказка о разнице в корпусе, поначалу было сложно уловить.

Adrian Larson 27.01.2021 21:39

Для моего консольная программа ответы с tkinter выше не совсем сработали для меня, потому что .destroy () всегда выдает ошибку:

can't invoke "event" command: application has been destroyed while executing...

или при использовании .withdraw () окно консоли не вернуло фокус.

Чтобы решить эту проблему, вам также необходимо вызвать .update () перед .destroy (). Пример:

# Python 3
import tkinter

r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()

R.withdraw () предотвращает отображение кадра в течение миллисекунды, а затем он будет уничтожен, возвращая фокус консоли.

Использовать библиотеку Pythons Буфер обмена

Его просто используют так:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  

По сути, это использование pyperclip. Буквально весь исходный код этого модуля: from pyperclip import copy, paste.

pbreach 11.10.2017 18:12

это правда. Однако они правы, что clipboard - лучшее имя. Эта функция должна быть включена в стандартную библиотеку Python.

Vincenzooo 10.10.2020 00:19

такой пакет просто позор ... с одной строкой кода, которая просто использует другой пакет ...

jdhao 03.02.2021 10:50

Я выяснил, что это самый простой способ получить доступ к буферу обмена из python:

1) Установите pyperclip: pip install pyperclip

2) Использование:

import pyperclip

s = pyperclip.paste()
pyperclip.copy(s)

# the type of s is string

Протестировано на 64-разрядной версии Win10, Python 3.5 и Python 3.7.3 (64-разрядной версии). Кажется, работает и с символами, отличными от ASCII. Протестированные символы включают ± ° © © αβγθΔΨΦåäö

на 3.6 подойдет? он установлен успешно, но при использовании метода paste () он дает мне ошибку: «из PySide импортировать версия как PYSIDE_VERSION # анализ: игнорировать ModuleNotFoundError: Нет модуля с именем 'PySide'». Когда я пытался установить Pyside, он говорит, что он не поддерживается в версии 3.6.

gaurav 30.03.2020 09:04

Да, он должен работать на Python 3.6, и я только что тестировал Python 3.7.4 (64-разрядный). Если посмотреть на setup.py пакета, он не должен иметь зависимостей от Pyside или любых других пакетов. Вы уверены, что команда paste пытается использовать Pyside?

np8 30.03.2020 11:03

Да, команда paste ищет Pyside, и поскольку Pyside поддерживает только до Python 3.4, она выдает ошибку

gaurav 02.04.2020 09:01

Кажется, это самое простое решение для WSL с python3.6.

enoted 09.09.2020 13:55

Я использовал pip для установки пакета clipboard, в котором есть только одна строка from pyperclip import copy, paste LOL. pyperclib - идеальное решение.

Lê Quang Duy 09.01.2021 12:07

pyperclip также работает на Mac и Linux (не только в Windows), что приятно.

David Foster 04.03.2021 18:37

Стандартная библиотека python делает это ...

try:
    # Python3
    import tkinter as tk
except ImportError:
    # Python2
    import Tkinter as tk

def getClipboardText():
    root = tk.Tk()
    # keep the window from showing
    root.withdraw()
    return root.clipboard_get()

Спасибо, у меня работает без использования сторонних пакетов.

jdhao 03.02.2021 10:48

Не очень прямая уловка:

Используйте горячую клавишу pyautogui:

Import pyautogui
pyautogui.hotkey('ctrl', 'v')

Таким образом, вы можете вставлять данные из буфера обмена по своему усмотрению.

Другие вопросы по теме