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

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

Ответ 1

Вы можете использовать модуль 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.

Ответ 2

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

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

Ответ 3

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

Кроме того, Tkinter находится в стандартной библиотеке python.

Ответ 4

Если вы не хотите устанавливать дополнительные пакеты, 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())

Ответ 5

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

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

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()

Ответ 6

Я узнал, что это был самый простой способ получить доступ к буферу из 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. Кажется, что работать с символами, отличными от ASCII, тоже. Протестированные символы включают ± ° ©© αβγθΔΨΦåäö

Ответ 7

Стандартная библиотека 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()

Ответ 8

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

См. пример здесь: http://code.activestate.com/recipes/474121/

Ответ 9

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

не может вызывать команду "event": приложение было уничтожено при выполнении...

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

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

# Python 3
import tkinter

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

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

Ответ 10

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

Его просто используют следующим образом:

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

Ответ 11

Не очень прямой трюк:

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

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

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