Comment lire le texte du presse-papiers (Windows) à partir de python?


Réponses:


104

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 obtient:

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. Cela permet à d'autres fenêtres d'accéder au presse-papiers. Ne placez pas d'objet dans le presse-papiers après avoir appelé CloseClipboard.


6
Savez-vous s'il existe un moyen d'utiliser l'instruction «with»?
Norfeldt du

3
À noter, dans py34, win7, SetClipboardText ne fonctionnait pas sans un appel préalable à EmptyClipboard
CoderTao

Ce module est utile si vous souhaitez effectuer des opérations plus complexes, par exemple extraire le contenu au format HTML du presse-papiers. Voir stackoverflow.com/questions/17298897/…
xji

2
@Norfeldt S'il n'y a pas de méthode native, vous pouvez facilement créer votre propre objet personnalisé qui prend en charge "avec"
Elijas

39

vous pouvez facilement le faire via le module intégré Tkinter qui est essentiellement une bibliothèque GUI. Ce code crée un widget vide pour obtenir le contenu du presse-papiers du système d'exploitation.

#from tkinter import Tk  # Python 3
from Tkinter import Tk
Tk().clipboard_get()

2
Veuillez ajouter un commentaire à ce code et (éventuellement) des liens vers la documentation pertinente.
jb.

6
devrait être tkinterau lieu de Tkinter. Sinon, cela ne fonctionnait pas sur mon python 3.7.3 64bit win10.
jerik

21

J'ai vu de nombreuses suggestions pour utiliser le module win32, mais Tkinter fournit la méthode la plus courte et la plus simple que j'ai vue, comme dans cet article: Comment copier une chaîne dans le presse-papiers sous Windows en utilisant Python?

De plus, Tkinter est dans la bibliothèque standard de python.


3
Un peu de code qui obtiendra la valeur du presse-papiers via Tkinter: de Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()
mgkrebbs

18

Si vous ne souhaitez pas installer de packages supplémentaires, vous ctypespouvez également 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())

Cela ne semble pas fonctionner sous Windows 10. Il imprime toujours "Aucun".
Aran-Fey

Windows 10 fonctionnait bien pour moi tant que j'utilisais Python 32 bits. J'ai mis à jour la réponse pour travailler également avec 64 bits.
kichik

aller cette erreur "pointeur char attendu, obtenu int" sur la ligne "text = ctypes.c_char_p (data_locked)", une idée?
txemsukr

Ce serait formidable de voir une solution similaire pour copier du texte dans le presse-papiers également.
mrkbutty

14

J'ai découvert que c'était le moyen le plus simple d'accéder au presse-papiers à partir de python:

1) Installez pyperclip: pip install pyperclip

2) utilisation:

import pyperclip

s = pyperclip.paste()
pyperclip.copy(s)

# the type of s is string

Testé sur Win10 64 bits, Python 3.5 et Python 3.7.3 (64 bits). Semble également fonctionner avec des caractères non ASCII. Les caractères testés incluent ± ° © © αβγθΔΨΦåäö


convient-il pour 3,6? il est installé avec succès mais lorsqu'il est utilisé avec la méthode paste (), il me donne une erreur: "à partir de la version d' importation PySide comme PYSIDE_VERSION # analyse: ignore ModuleNotFoundError: Aucun module nommé 'PySide'". Quand j'ai essayé d'installer Pyside, il dit qu'il n'est pas pris en charge dans la version 3.6
Gaurav

Oui, cela devrait fonctionner sur Python 3.6, et je viens de tester avec Python 3.7.4 (64 bits). En regardant le setup.py du package, il ne devrait avoir aucune dépendance à Pyside ou à tout autre package. Êtes-vous sûr que la commande coller essaie d'utiliser Pyside?
np8

Oui, la commande coller recherche Pyside et comme Pyside ne prend en charge que jusqu'à python 3.4, elle donne une erreur
gaurav

Cela semble être la solution la plus simple pour WSL avec python3.6
énoncé

11

La réponse la plus votée ci-dessus est étrange dans la mesure où elle efface simplement le presse-papiers puis obtient le contenu (qui est alors vide). On pourrait effacer le presse-papiers pour être sûr que certains types de contenu de presse-papiers comme «texte formaté» ne «couvrent» pas le contenu de texte brut que vous souhaitez enregistrer dans le presse-papiers.

Le morceau de code suivant remplace toutes les nouvelles lignes dans le presse-papiers par des espaces, puis supprime tous les espaces doubles et enregistre enfin 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()

7

La bibliothèque standard python le fait ...

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


3

Pour mon programme de console, les réponses avec tkinter ci-dessus ne fonctionnaient pas tout à fait pour moi car le .destroy () donnait toujours une erreur ,:

impossible d'appeler la commande "event": l'application a été détruite lors de l'exécution ...

ou lors de l'utilisation de .withdraw (), la fenêtre de la console n'a pas récupéré le focus.

Pour résoudre ce problème, vous devez également appeler .update () avant le .destroy (). Exemple:

# Python 3
import tkinter

r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()

Le r.withdraw () empêche le cadre de s'afficher pendant un milliseconde, puis il sera détruit en renvoyant le focus à la console.


2

Utiliser le presse-papiers de la bibliothèque Pythons

Il est simplement utilisé comme ceci:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  

8
Ceci utilise essentiellement pyperclip. Le code source complet de ce module est littéralement: from pyperclip import copy, paste.
pbreach

1

Une astuce pas très directe:

Utilisez la touche de raccourci pyautogui:

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

Par conséquent, vous pouvez coller les données du presse-papiers à votre guise.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.