2008-09-19 8 views
58

Comment lire du texte depuis le presse-papiers (windows) à partir de python? Essayez win32clipboard à partir du paquetage win32all (qui est probablement installé si vous êtes sur ActiveState Python)Comment lire du texte depuis le presse-papiers (Windows) à partir de python?

+1

En relation avec [cette question] (http://stackoverflow.com/q/579687/296974). – glglgl

+0

dans mon cas, seulement [dan] (http://stackoverflow.com/users/2084578/dan) réponse a fonctionné, qui utilise [presse-papiers] (https://pypi.python.org/pypi/clipboard/0.0.4) paquet. – Soorena

Répondre

66

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

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 terminé l'examen ou de changer 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 un objet sur le presse-papiers après avoir appelé CloseClipboard.

+3

Savez-vous s'il existe un moyen d'utiliser l'instruction 'with '? – Norfeldt

+3

À noter, dans py34, win7, SetClipboardText n'a pas fonctionné sans un appel précédent à EmptyClipboard – CoderTao

+0

Ce module est utile si vous voulez effectuer des opérations plus complexes, par ex. obtenir le contenu au format HTML hors du presse-papiers. Voir http://stackoverflow.com/questions/17298897/how-can--copy-from-an-html-file-to-the-clipboard-in-python-in-formatted-text –

19

J'ai vu beaucoup de suggestions pour utiliser le module win32, mais Tkinter fournit la plus courte et la plus simple méthode que je l'ai vu, comme dans ce post: How do I copy a string to the clipboard on Windows using Python?

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

+3

Un code qui va avoir la valeur du presse-papiers via Tkinter: de Tkinter import Tk [\ nl] r = Tk() [\ nl] résultat = r.selection_get (sélection = "clipboard") [\ nl] r.destroy() – mgkrebbs

11

La réponse la plus mise à jour ci-dessus est bizarre de manière à effacer simplement le Presse-papiers, puis à récupérer le contenu (qui est alors vide). On pourrait effacer le presse-papiers pour être sûr qu'un certain type de contenu de presse-papiers comme "texte formulé" ne "couvre" pas votre contenu en texte brut que vous souhaitez enregistrer dans le presse-papiers.

La pièce de code suivante remplace tous les sauts de ligne dans le presse-papiers par des espaces, puis supprime tous les espaces doubles et enregistre finalement le contenu vers 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() 
9

Si vous ne souhaitez pas installer des packages supplémentaires , ctypes peut faire le travail aussi bien.

import ctypes 

CF_TEXT = 1 

kernel32 = ctypes.windll.kernel32 
user32 = ctypes.windll.user32 

user32.OpenClipboard(0) 
if user32.IsClipboardFormatAvailable(CF_TEXT): 
    data = user32.GetClipboardData(CF_TEXT) 
    data_locked = kernel32.GlobalLock(data) 
    text = ctypes.c_char_p(data_locked) 
    print(text.value) 
    kernel32.GlobalUnlock(data_locked) 
else: 
    print('no text in clipboard') 
user32.CloseClipboard() 
18

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

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

S'il vous plaît ajouter un commentaire à ce code, et (éventuellement) des liens vers une documentation pertinente. –

+0

@jb. fait :) merci pour la note – kmonsoor

2

Pour mon programme de console les réponses avec tkinter ci-dessus ne fonctionne pas très bien pour moi parce que le .destroy() a toujours donné une erreur ,:

ne peut invoquer la commande « événement » : 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 montrer un milisecond, puis il sera détruit donner le focus à la console.

2

Utiliser la bibliothèque Pythons Clipboard

Son simplement utilisé comme ceci:

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

les autres ne fonctionnaient pas, merci. – Soorena

+0

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

1

J'ai découvert c'était la meilleure façon d'obtenir l'accès au presse-papiers du python:

1) Installer 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. Semble fonctionner avec des caractères non-ASCII, aussi. Les caractères testés comprennent: ± ° ©© αβγθΔΨΦåäö

Questions connexes