Foo42
¿Cómo leo el texto del portapapeles (de Windows) con python?
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
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
np8
encontré clipper para ser la forma más fácil de acceder al portapapeles desde python:
-
Instalar pyperclip:
pip install pyperclip
-
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íneafrom 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
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())
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
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
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