Comment lire du texte à partir du presse-papiers (Windows) avec python ?
Savez-vous s'il existe un moyen d'utiliser l'instruction "avec" ?
Comment lire du texte à partir du presse-papiers (Windows) avec python ?
Vous pouvez utiliser le module appelé win32clipboard qui fait partie de pywin32 .
Voici un exemple qui définit d'abord les données du presse-papiers puis les récupère :
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 rappel important de la documentation :
Lorsque la fenêtre a fini d'examiner ou de modifier le presse-papiers, fermez le presse-papiers en appelant CloseClipboard. Ceci permet aux autres fenêtres d'accéder au presse-papiers. Ne placez pas d'objet sur le presse-papiers après avoir appelé CloseClipboard.
Il convient de noter que dans py34, win7, SetClipboardText ne fonctionne pas sans un appel préalable à EmptyClipboard.
Ce module est utile si vous souhaitez effectuer des opérations plus complexes, par exemple récupérer le contenu formaté en HTML dans le presse-papiers. Voir stackoverflow.com/questions/17298897/
Vous pouvez facilement réaliser cette opération grâce au module intégré Tkinter qui est essentiellement une bibliothèque GUI. Ce code crée un widget vide pour récupérer le contenu du presse-papiers de l'OS.
from tkinter import Tk # Python 3
#from Tkinter import Tk # for Python 2.x
Tk().clipboard_get()
Veuillez ajouter des commentaires sur ce code, et (éventuellement) des liens vers la documentation correspondante.
Devrait être tkinter
au lieu de Tkinter
. Par contre, il ne fonctionne pas sur mon python 3.7.3 64bit win10.
Si vous ne voulez pas installer de paquets supplémentaires, ctypes
peut aussi bien faire le travail.
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())
Windows 10 a bien fonctionné pour moi tant que j'ai utilisé Python 32 bits. J'ai mis à jour la réponse pour qu'elle fonctionne également avec 64 bits.
Je reçois cette erreur "expected char pointer, got int" sur la ligne "text = ctypes.c_char_p(data_locked)", une idée ?
J'ai vu de nombreuses suggestions pour utiliser le module win32, mais Tkinter fournit la méthode la plus courte et la plus facile que j'ai vue, comme dans ce post : Comment copier une chaîne de caractères dans le presse-papiers sous Windows en utilisant Python ?
De plus, Tkinter fait partie de la bibliothèque standard de Python.
Un peu de code qui va récupérer la valeur du presse-papiers via Tkinter : from Tkinter import Tk [ \nl ] r = Tk() [ \nl ] result = r.selection_get(selection = "CLIPBOARD") [ \nl ] r.destroy()
La réponse la plus votée ci-dessus est bizarre dans le sens où elle efface simplement le Presse-papiers et récupère ensuite le contenu (qui est alors vide). On pourrait effacer le presse-papiers pour s'assurer qu'un type de contenu du presse-papiers comme "texte formaté" ne "couvre" pas le contenu en texte brut que vous voulez enregistrer dans le presse-papiers.
Le morceau de code suivant remplace toutes les nouvelles lignes du presse-papiers par des espaces, puis supprime tous les espaces doubles et enfin enregistre le contenu dans le presse-papiers :
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()
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
4 votes
En rapport avec cette question .
0 votes
Dans mon cas, seulement dan réponse travaillée, qui utilise presse-papiers paquet.