¿Cómo leo el texto del portapapeles (de Windows) de Python?

Respuestas:

104

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.

Sakin
fuente
6
¿Sabes si hay alguna forma de usar la instrucción `with´?
Norfeldt
3
Vale la pena señalar que en py34, win7, SetClipboardText no funcionó sin una llamada anterior a EmptyClipboard
CoderTao
Este módulo es útil si desea realizar operaciones más complejas, por ejemplo, sacar el contenido con formato HTML del portapapeles. Ver stackoverflow.com/questions/17298897/…
xji
2
@Norfeldt Si no hay una forma nativa, puede crear fácilmente su propio objeto personalizado que admita "con"
Elijas Dapšauskas
39

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()
kmonsoor
fuente
2
Agregue un comentario a este código y (posiblemente) enlaces a documentación relevante.
jb.
6
debería ser en tkinterlugar de Tkinter. De lo contrario, no funcionó en mi python 3.7.3 64bit win10.
jerik
21

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.

Botones840
fuente
3
Algún código que obtendrá el valor del portapapeles a través de Tkinter: from Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()
mgkrebbs
18

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())
kichik
fuente
Esto no parece funcionar en Windows 10. Siempre imprime "Ninguno".
Aran-Fey
Windows 10 funcionó bien para mí siempre que usara Python de 32 bits. Actualicé la respuesta para que funcione también con 64 bits.
kichik
ir a este error "puntero char esperado, tengo int" en la línea "text = ctypes.c_char_p (data_locked)", ¿alguna idea?
txemsukr
Sería genial ver una solución similar para copiar texto al portapapeles también.
mrkbutty
14

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 ± ° © © αβγθΔΨΦåäö

np8
fuente
¿Es adecuado para 3.6? se instala con éxito pero cuando se usa el método paste () me da un error: "de la versión de importación de PySide como PYSIDE_VERSION # análisis: ignorar ModuleNotFoundError: No hay módulo llamado 'PySide'". Cuando intenté instalar Pyside, dice que no es compatible con 3.6
gaurav
Sí, debería funcionar en Python 3.6, y acabo de probar con Python 3.7.4 (64 bits). Mirando el setup.py del paquete, no debería tener dependencias con Pyside o cualquier otro paquete. ¿Estás seguro de que el comando pegar está intentando usar Pyside?
np8
Sí, el comando de pegar está buscando Pyside y como Pyside solo admite hasta Python 3.4, da un error
gaurav
Parece ser la solución más simple para WSL con python3.6
registró el
11

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

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()
Paul Sumpner
fuente
3

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.

user136036
fuente
2

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()  
Dan
fuente
8
Básicamente, se usa pyperclip. El código fuente completo de este módulo es literalmente: from pyperclip import copy, paste.
pbreach
1

Un truco no muy directo:

Utilice la tecla de acceso rápido pyautogui:

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

Por lo tanto, puede pegar los datos del portapapeles como desee.

ver2
fuente