¿Cómo leo el texto del portapapeles (de Windows) de Python?
¿Cómo leo el texto del portapapeles (de Windows) de Python?
Respuestas:
Puede usar el módulo llamado win32clipboard , que es parte de pywin32 .
Aquí hay un ejemplo que primero establece los datos del portapapeles y luego los obtiene:
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
Un recordatorio importante de la documentación:
Cuando la ventana haya terminado de examinar o cambiar el portapapeles, cierre el portapapeles llamando a CloseClipboard. Esto permite que otras ventanas accedan al portapapeles. No coloque un objeto en el portapapeles después de llamar a CloseClipboard.
puede hacer esto fácilmente a través del módulo incorporado Tkinter, que es básicamente una biblioteca GUI. Este código crea un widget en blanco para obtener el contenido del portapapeles del sistema operativo.
#from tkinter import Tk # Python 3
from Tkinter import Tk
Tk().clipboard_get()
tkinterlugar de Tkinter. De lo contrario, no funcionó en mi python 3.7.3 64bit win10.
He visto muchas sugerencias para usar el módulo win32, pero Tkinter proporciona el método más corto y fácil que he visto, como en esta publicación: ¿Cómo copio una cadena al portapapeles en Windows usando Python?
Además, Tkinter está en la biblioteca estándar de Python.
Si no desea instalar paquetes adicionales, también ctypespuede hacer el trabajo.
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())
Descubrí que esta era la forma más fácil de acceder al portapapeles desde Python:
1) Instale pyperclip:
pip install pyperclip
2) uso:
import pyperclip
s = pyperclip.paste()
pyperclip.copy(s)
# the type of s is string
Probado en Win10 de 64 bits, Python 3.5 y Python 3.7.3 (64 bits). Parece que también funciona con caracteres que no son ASCII. Los caracteres probados incluyen ± ° © © αβγθΔΨΦåäö
La respuesta más votada arriba es extraña de una manera que simplemente borra el Portapapeles y luego obtiene el contenido (que luego está vacío). Uno podría limpiar el portapapeles para asegurarse de que algún tipo de contenido del portapapeles como "texto formateado" no "cubra" el contenido de texto sin formato que desea guardar en el portapapeles.
El siguiente fragmento de código reemplaza todas las líneas nuevas en el portapapeles por espacios, luego elimina todos los espacios dobles y finalmente guarda el contenido en el portapapeles:
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()
La biblioteca estándar de Python lo hace ...
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()
Pruebe win32clipboard desde el paquete win32all (que probablemente esté instalado si está en ActiveState Python).
Vea la muestra aquí: http://code.activestate.com/recipes/474121/
Para el programa de mi consola, las respuestas con tkinter anteriores no me funcionaron porque el .destroy () siempre dio un error:
no se puede invocar el comando "evento": la aplicación ha sido destruida mientras se ejecutaba ...
o al usar .withdraw () la ventana de la consola no recuperó el foco.
Para resolver esto, también debe llamar a .update () antes de .destroy (). Ejemplo:
# Python 3
import tkinter
r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()
El r.withdraw () evita que el marco se muestre durante un milisegundo, y luego se destruirá devolviendo el foco a la consola.
Usar el Portapapeles de la biblioteca de Pythons
Simplemente se usa así:
import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()
from pyperclip import copy, paste.