Как прочитать текст из буфера обмена (windows) с помощью Python?
в моем случае работал только ответ дан, который использует пакет буфер обмена.






Попробуйте 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»?
Стоит отметить, что в py34, win7 SetClipboardText не работал без предшествующего вызова EmptyClipboard.
Этот модуль полезен, если вы хотите выполнять более сложные операции, например. извлечение содержимого в формате HTML из буфера обмена. См. stackoverflow.com/questions/17298897/…
@Norfeldt Если нет собственного способа, вы можете легко создать свой собственный настраиваемый объект, который поддерживает "with"
Не работает, если я пытался скопировать многострочный текст с помощью строковой переменной, определенной с помощью "" "
Я видел много предложений по использованию модуля win32, но Tkinter предоставляет самый короткий и простой метод, который я видел, как в этом посте: Как скопировать строку в буфер обмена в Windows с помощью Python?
Кроме того, Tkinter входит в стандартную библиотеку Python.
Некоторый код, который получит значение буфера обмена через Tkinter: from Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()
Ответ, получивший наибольшее количество голосов выше, странен в том смысле, что он просто очищает буфер обмена, а затем получает содержимое (которое затем становится пустым). Можно очистить буфер обмена, чтобы быть уверенным, что некоторый тип содержимого буфера обмена, такой как «форматированный текст», не «покрывает» ваше обычное текстовое содержимое, которое вы хотите сохранить в буфере обмена.
Следующий фрагмент кода заменяет все новые строки в буфере обмена пробелами, затем удаляет все двойные пробелы и, наконец, сохраняет содержимое обратно в буфер обмена:
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. Он всегда печатает «Нет».
Windows 10 отлично работала у меня, пока я использовал 32-разрядную версию Python. Я обновил ответ для работы с 64-битной версией.
перейти к этой ошибке "ожидаемый указатель char, получил int" в строке "text = ctypes.c_char_p (data_locked)", любая идея?
Было бы здорово увидеть подобное решение и для копирования текста в буфер обмена.
какие-нибудь советы по перечислению дополнительных доступных форматов буфера обмена? Возможно получение двоичных / файловых данных?
вы можете легко сделать это с помощью встроенного модуля Ткинтер, который в основном представляет собой библиотеку графического интерфейса. Этот код создает пустой виджет для получения содержимого буфера обмена из ОС.
from tkinter import Tk # Python 3
#from Tkinter import Tk # for Python 2.x
Tk().clipboard_get()
Пожалуйста, добавьте комментарий к этому коду и (возможно) ссылки на полезную документацию.
должен быть tkinter вместо Tkinter. В противном случае это не сработало на моем python 3.7.3 64bit win10.
Намного лучше, чем пытаться установить pywin32, так как у этого есть ряд известных проблем. Хорошая подсказка о разнице в корпусе, поначалу было сложно уловить.
Для моего консольная программа ответы с 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.
это правда. Однако они правы, что clipboard - лучшее имя. Эта функция должна быть включена в стандартную библиотеку Python.
такой пакет просто позор ... с одной строкой кода, которая просто использует другой пакет ...
Я выяснил, что это самый простой способ получить доступ к буферу обмена из 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.
Да, он должен работать на Python 3.6, и я только что тестировал Python 3.7.4 (64-разрядный). Если посмотреть на setup.py пакета, он не должен иметь зависимостей от Pyside или любых других пакетов. Вы уверены, что команда paste пытается использовать Pyside?
Да, команда paste ищет Pyside, и поскольку Pyside поддерживает только до Python 3.4, она выдает ошибку
Кажется, это самое простое решение для WSL с python3.6.
Я использовал pip для установки пакета clipboard, в котором есть только одна строка from pyperclip import copy, paste LOL. pyperclib - идеальное решение.
pyperclip также работает на Mac и Linux (не только в Windows), что приятно.
Стандартная библиотека 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()
Спасибо, у меня работает без использования сторонних пакетов.
Не очень прямая уловка:
Используйте горячую клавишу pyautogui:
Import pyautogui
pyautogui.hotkey('ctrl', 'v')
Таким образом, вы можете вставлять данные из буфера обмена по своему усмотрению.
Относится к этот вопрос.