Як прочитати текст з буфера обміну (windows) з python?
Як прочитати текст з буфера обміну (windows) з python?
Відповіді:
Ви можете використовувати модуль під назвою 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
Важливе нагадування з документації:
Коли вікно закінчить перевірку або зміну буфера обміну, закрийте буфер обміну, зателефонувавши CloseClipboard. Це дозволяє іншим вікнам отримувати доступ до буфера обміну. Не кладіть об’єкт у буфер обміну після виклику CloseClipboard.
Ви можете легко зробити це за допомогою вбудованого модуля Tkinter, який в основному є бібліотекою графічного інтерфейсу. Цей код створює порожній віджет для отримання вмісту буфера обміну з ОС.
#from tkinter import Tk # Python 3
from Tkinter import Tk
Tk().clipboard_get()
tkinter
замість Tkinter
. В іншому випадку це не працювало на моєму python 3.7.3 64bit win10.
Я бачив багато пропозицій щодо використання модуля win32, але Tkinter пропонує найкоротший і найпростіший метод, який я бачив, як у цій публікації: Як скопіювати рядок у буфер обміну в Windows за допомогою Python?
Плюс, Tkinter є у стандартній бібліотеці python.
Якщо ви не хочете встановлювати додаткові пакети, 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())
Я з’ясував, що це найпростіший спосіб отримати доступ до буфера обміну з 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. Тестовані символи включають ± ° © © αβγθΔΨΦåäö
Найголосніша відповідь, наведена вище, дивна у тому, що вона просто очищає буфер обміну, а потім отримує вміст (який потім порожній). Можна очистити буфер обміну, щоб бути впевненим, що певний тип вмісту буфера обміну, наприклад "відформатований текст", не "охоплює" ваш звичайний текстовий вміст, який ви хочете зберегти в буфері обміну.
Наступний фрагмент коду замінює всі нові рядки в буфері обміну пробілами, потім видаляє всі подвійні пробіли і, нарешті, зберігає вміст назад у буфер обміну:
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()
Стандартна бібліотека 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()
Спробуйте win32clipboard із пакета win32all (це, ймовірно, встановлено, якщо ви працюєте на ActiveState Python).
Дивіться зразок тут: http://code.activestate.com/recipes/474121/
Для моєї консольної програми відповіді з tkinter вище для мене не зовсім працювали, оскільки .destroy () завжди давав помилку:
не вдається викликати команду "event": додаток було знищено під час виконання ...
або при використанні .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()
from pyperclip import copy, paste
.