Come leggo il testo dagli appunti (di Windows) da Python?


Risposte:


103

Puoi usare il modulo chiamato win32clipboard , che fa parte di pywin32 .

Ecco un esempio che prima imposta i dati degli appunti e poi li ottiene:

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 importante promemoria dalla documentazione:

Quando la finestra ha terminato di esaminare o modificare gli appunti, chiudere gli appunti chiamando CloseClipboard. Ciò consente ad altre finestre di accedere agli appunti. Non posizionare un oggetto negli appunti dopo aver chiamato CloseClipboard.


6
Sai se c'è un modo per usare l'istruzione "with"?
Norfeldt,

3
Degno di nota, in py34, win7, SetClipboardText non ha funzionato senza una precedente chiamata a EmptyClipboard
CoderTao

Questo modulo è utile se si desidera eseguire operazioni più complesse, ad esempio estrarre il contenuto in formato HTML dagli appunti. Vedere stackoverflow.com/questions/17298897/...
xji

2
@Norfeldt Se non esiste un modo nativo, puoi facilmente creare il tuo oggetto personalizzato che supporta "con"
Elijas

38

puoi farlo facilmente attraverso il modulo integrato Tkinter che è fondamentalmente una libreria GUI. Questo codice crea un widget vuoto per ottenere il contenuto degli appunti dal sistema operativo.

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

2
Si prega di aggiungere commenti a questo codice e (possibilmente) collegamenti a documentazione rilevante.
jb.

5
dovrebbe essere tkinterinvece di Tkinter. Altrimenti non ha funzionato sul mio Python 3.7.3 64bit win10.
jerik

21

Ho visto molti suggerimenti per utilizzare il modulo win32, ma Tkinter fornisce il metodo più breve e più semplice che ho visto, come in questo post: Come faccio a copiare una stringa negli appunti su Windows usando Python?

Inoltre, Tkinter è nella libreria standard di Python.


3
Un po 'di codice che otterrà il valore degli appunti tramite Tkinter: da Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "APPUNTI") [\ nl] r.destroy ()
mgkrebbs

18

Se non vuoi installare pacchetti extra, ctypespuoi anche portare a termine il lavoro.

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

Questo non sembra funzionare su Windows 10. Stampa sempre "Nessuno".
Aran-Fey

Windows 10 ha funzionato bene per me finché ho usato Python a 32 bit. Ho aggiornato la risposta per funzionare anche con 64 bit.
kichik

vai questo errore "puntatore char atteso, ottenuto int" sulla riga "text = ctypes.c_char_p (data_locked)", qualche idea?
txemsukr

Sarebbe bello vedere una soluzione simile per copiare anche il testo negli appunti.
mrkbutty

11

La risposta più votata sopra è strana in quanto cancella semplicemente gli Appunti e quindi ottiene il contenuto (che è quindi vuoto). È possibile cancellare gli appunti per essere sicuri che alcuni tipi di contenuto degli appunti come "testo formattato" non "coprano" il contenuto di testo normale che si desidera salvare negli appunti.

La parte di codice seguente sostituisce tutte le nuove righe negli appunti con spazi, quindi rimuove tutti i doppi spazi e infine salva il contenuto negli appunti:

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

11

Ho scoperto che questo era il modo più semplice per accedere agli appunti da Python:

1) Installa pyperclip: pip install pyperclip

2) Utilizzo:

import pyperclip

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

# the type of s is string

Testato su Win10 64 bit, Python 3.5 e Python 3.7.3 (64 bit). Sembra funzionare anche con caratteri non ASCII. I caratteri testati includono ± ° © © αβγθΔΨΦåäö


è adatto per 3.6? è installato con successo ma quando si usa il metodo paste () mi dà l'errore: "dalla versione importata da PySide come PYSIDE_VERSION # analisi: ignora ModuleNotFoundError: Nessun modulo chiamato 'PySide'". Quando ho provato a installare Pyside dice che non è supportato in 3.6
gaurav

Sì, dovrebbe funzionare su Python 3.6 e ho appena testato con Python 3.7.4 (64 bit). Guardando setup.py del pacchetto non dovrebbe avere dipendenze da Pyside o da altri pacchetti. Sei sicuro che il comando incolla stia tentando di utilizzare Pyside?
np8

Sì, il comando incolla sta cercando Pyside e poiché Pyside supporta solo fino a Python 3.4 dà un errore
gaurav

7

La libreria standard python lo fa ...

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

Per il mio programma di console le risposte con tkinter sopra non hanno funzionato per me perché .destroy () dava sempre un errore:

impossibile richiamare il comando "evento": l'applicazione è stata distrutta durante l'esecuzione ...

o quando si utilizza .withdraw () la finestra della console non ha recuperato il focus.

Per risolvere questo problema devi anche chiamare .update () prima di .destroy (). Esempio:

# Python 3
import tkinter

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

R.withdraw () impedisce la visualizzazione del frame per un millisecondo, quindi verrà distrutto restituendo il focus alla console.


2

Usa gli Appunti della libreria Pythons

È semplicemente usato in questo modo:

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

8
Questo essenzialmente sta usando pyperclip. L'intero codice sorgente di questo modulo è letteralmente: from pyperclip import copy, paste.
pbreach l'

1

Un trucco non molto diretto:

Usa il tasto di scelta rapida pyautogui:

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

Pertanto, puoi incollare i dati degli appunti come preferisci.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.