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

7 minutos de lectura

Avatar de usuario de Foo42
Foo42

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

  • Relacionado con esta pregunta.

    – glglgl

    15 de noviembre de 2012 a las 13:48

  • en mi caso, solo funcionó dan answer , que usa portapapeles paquete.

    – Soorena

    9 oct 2016 a las 13:04


  • observe cómo el título de la pregunta no da contexto de que esto es específico de Python y Windows

    – Jason S.

    25 de febrero a las 15:04

  • @JasonS Punto justo. Tenga en cuenta que la pregunta se hizo en 2008 cuando el sitio era bastante nuevo y, por extensión, no lo había estado usando por mucho tiempo. Creo que mi razonamiento fue que esos detalles fueron capturados por el uso de etiquetas. He editado el título para que contenga esos detalles ahora.

    – Foo42

    27 de febrero a las 11:47

  • De acuerdo, me uní en diciembre de 2008 y recuerdo los primeros días. La opinión predominante en estos días parece ser deshacerse de las claves de contexto del título y confiar en las etiquetas, pero cuando encuentra contenido de StackOverflow en Google o en la sección “Enlazado”/”Relacionado” de este sitio, todo lo que ve es el título. De todos modos, mi comentario estaba dirigido mucho menos a usted que a la mente de colmena de moderación SO general.

    – Jason S.

    28 de febrero a las 3:05

Avatar de usuario de Sakin
sakin

Puedes usar el módulo llamado portapapeles win32que 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.

  • ¿Sabes si hay alguna manera de usar la instrucción `with´?

    – Norfeldt

    11 de julio de 2013 a las 14:21

  • Vale la pena señalar que en py34, win7, SetClipboardText no funcionó sin una llamada anterior a EmptyClipboard

    – CoderTao

    12 de enero de 2015 a las 21:57

  • Este módulo es útil si desea realizar operaciones más complejas, por ejemplo, sacar el contenido en formato HTML del portapapeles. Ver stackoverflow.com/questions/17298897/…

    – xji

    8 de septiembre de 2016 a las 8:23

  • @Norfeldt Si no hay una forma nativa, puede crear fácilmente su propio objeto personalizado que admita “con”

    – Elijas Dapšauskas

    28 de junio de 2018 a las 18:38

  • No funciona si intento copiar un texto con varias líneas usando una variable de cadena definida con “””

    –Rodrigo Vieira

    6 de diciembre de 2020 a las 21:19

avatar de usuario de kmonsoor
kmonsoor

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 # for Python 2.x
Tk().clipboard_get()

  • Mucho mejor en mi opinión que tratar de conseguir pywin32 instalado, ya que tiene una serie de problemas conocidos. Buen consejo sobre la diferencia de carcasa, fue difícil de entender al principio.

    – Adrián Larson

    27 de enero de 2021 a las 18:39

avatar de usuario de np8
np8

encontré clipper para ser la forma más fácil de acceder al portapapeles desde python:

  1. Instalar pyperclip:
    pip install pyperclip

  2. Uso:

import pyperclip
    
s = pyperclip.paste()
pyperclip.copy(s)
    
# the type of s is string

Es compatible con Windows, Linux y Mac, y parece funcionar también con caracteres que no son ASCII. Los caracteres probados incluyen ±°©©αβγθΔΨΦåäö

  • Sirve para 3.6? se instaló con éxito, pero cuando se usa el método pegar (), me da un error: “desde la importación de PySide versión como PYSIDE_VERSION # análisis: ignore ModuleNotFoundError: ningún módulo llamado ‘PySide’ “. Cuando intenté instalar Pyside, dice que no es compatible con 3.6

    – gaurav

    30 de marzo de 2020 a las 6:04


  • Sí, debería funcionar en Python 3.6 y acabo de probar con Python 3.7.4 (64 bits). mirando el configuración.py del paquete, no debe tener dependencias con Pyside ni con ningún otro paquete. ¿Estás seguro de que el comando pegar está intentando usar Pyside?

    – np8

    30 de marzo de 2020 a las 8:03

  • Sí, el comando de pegado está buscando Pyside y, como Pyside solo es compatible con Python 3.4, da un error.

    – gaurav

    2 de abril de 2020 a las 6:01

  • Usé pip para instalar clipboard paquete que solo tiene una línea from pyperclip import copy, paste JAJAJA. pyperclib es la solución perfecta.

    – Lê Quang Duy

    9 de enero de 2021 a las 9:07

  • pyperclip también funciona en Mac y Linux (no solo en Windows), lo cual es bueno.

    –David Foster

    4 de marzo de 2021 a las 15:37


avatar de usuario de kichik
kichik

Si no desea instalar paquetes adicionales, ctypes puede hacer el trabajo también.

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

Avatar de usuario de Buttons840
Botones840

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.

  • Algún código que obtendrá el valor del portapapeles a través de Tkinter: from Tkinter import Tk [\nl] r = Tk() [\nl] resultado = r.selection_get(selección = “PORTAPAPELES”) [\nl] r. destruir ()

    – mgkrebbs

    8 de enero de 2014 a las 0:42


  • Ciertamente es fácil, pero puede cambiar el enfoque de la ventana momentáneamente causando parpadeo de la ventana. Probablemente valga la pena codificar win32clipboard si está disponible, recurriendo a Tkinter si no.

    – Keeely

    18 de noviembre de 2021 a las 11:29

La respuesta más votada arriba es extraña en el sentido de que simplemente borra el Portapapeles y luego obtiene el contenido (que luego está vacío). Se podría borrar el portapapeles para asegurarse de que algún tipo de contenido del portapapeles, como “texto con formato”, no “cubra” el contenido de texto sin formato que desea guardar en el portapapeles.

La siguiente pieza 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()

  • Algún código que obtendrá el valor del portapapeles a través de Tkinter: from Tkinter import Tk [\nl] r = Tk() [\nl] resultado = r.selection_get(selección = “PORTAPAPELES”) [\nl] r. destruir ()

    – mgkrebbs

    8 de enero de 2014 a las 0:42


  • Ciertamente es fácil, pero puede cambiar el enfoque de la ventana momentáneamente causando parpadeo de la ventana. Probablemente valga la pena codificar win32clipboard si está disponible, recurriendo a Tkinter si no.

    – Keeely

    18 de noviembre de 2021 a las 11:29

avatar de usuario de ankostis
ankosti

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

  • Gracias, funciona para mí sin necesidad de usar paquetes de terceros.

    – jdhao

    3 de febrero de 2021 a las 7:48

  • Buena solución. Mejor root.quit() en algún lugar si no necesitamos la GUI Tk.

    – kakyo

    29 de junio de 2021 a las 7:25

¿Ha sido útil esta solución?