Как читать текст из буфера обмена (windows) из python - PullRequest
74 голосов
/ 19 сентября 2008

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

Ответы [ 10 ]

83 голосов
/ 19 сентября 2008

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

22 голосов
/ 24 мая 2014

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

#from tkinter import Tk  # Python 3
from Tkinter import Tk
Tk().clipboard_get()
19 голосов
/ 07 ноября 2011

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

Плюс, Tkinter находится в стандартной библиотеке Python.

13 голосов
/ 25 апреля 2014

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

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

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

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 голосов
/ 03 июля 2016

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

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

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

import pyperclip

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

# the type of s is string

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

3 голосов
/ 04 апреля 2018

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

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

def getClipboardText():
    root = tk.Tk()
    # keep the window from showing
    root.withdraw()
    return root.clipboard_get()
3 голосов
/ 19 сентября 2008

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

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

2 голосов
/ 27 апреля 2016

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

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

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  
2 голосов
/ 17 января 2015

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

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

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

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

# Python 3
import tkinter

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...