Wie lese ich Text aus der (Windows-) Zwischenablage von Python?

92

Wie lese ich Text aus der (Windows-) Zwischenablage von Python?

Foo42
quelle
3
Bezogen auf diese Frage .
glglgl
In meinem Fall hat nur Dan Answer funktioniert, bei dem das Clipboard- Paket verwendet wird.
Soorena

Antworten:

102

Sie können das Modul win32clipboard verwenden , das Teil von pywin32 ist .

Hier ist ein Beispiel, in dem zuerst die Daten der Zwischenablage festgelegt und dann abgerufen werden:

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

Eine wichtige Erinnerung aus der Dokumentation:

Wenn das Fenster die Zwischenablage überprüft oder geändert hat, schließen Sie die Zwischenablage, indem Sie CloseClipboard aufrufen. Dadurch können andere Fenster auf die Zwischenablage zugreifen. Platzieren Sie nach dem Aufruf von CloseClipboard kein Objekt in der Zwischenablage.

Sakin
quelle
6
Wissen Sie, ob es eine Möglichkeit gibt, die with-Anweisung zu verwenden?
Norfeldt
3
Bemerkenswert ist, dass SetClipboardText in py34, win7 ohne einen vorherigen Aufruf von EmptyClipboard
CoderTao am
Dieses Modul ist nützlich, wenn Sie komplexere Vorgänge ausführen möchten, z. B. den HTML-formatierten Inhalt aus der Zwischenablage entfernen möchten. Siehe stackoverflow.com/questions/17298897/…
xji
1
@Norfeldt Wenn es keinen nativen Weg gibt, können Sie einfach Ihr eigenes benutzerdefiniertes Objekt erstellen, das "mit" unterstützt
Elijas
38

Sie können dies einfach über das integrierte Modul Tkinter erledigen, das im Grunde eine GUI-Bibliothek ist. Dieser Code erstellt ein leeres Widget, um den Inhalt der Zwischenablage vom Betriebssystem abzurufen.

#from tkinter import Tk  # Python 3
from Tkinter import Tk
Tk().clipboard_get()
kmonsoor
quelle
2
Bitte fügen Sie diesem Code einen Kommentar und (möglicherweise) Links zur Dokumentation hinzu.
jb.
5
sollte tkinterstatt sein Tkinter. Ansonsten funktionierte es auf meinem Python 3.7.3 64bit Win10 nicht.
Jerik
21

Ich habe viele Vorschläge zur Verwendung des win32-Moduls gesehen, aber Tkinter bietet die kürzeste und einfachste Methode, die ich je gesehen habe, wie in diesem Beitrag: Wie kopiere ich eine Zeichenfolge mit Python in die Zwischenablage unter Windows?

Außerdem befindet sich Tkinter in der Python-Standardbibliothek.

Buttons840
quelle
3
Ein Code, der den Wert der Zwischenablage über Tkinter erhält: Importieren von Tkinter Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()
mgkrebbs
18

Wenn Sie keine zusätzlichen Pakete installieren möchten, ctypeskönnen Sie den Job auch erledigen.

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())
kichik
quelle
Dies scheint unter Windows 10 nicht zu funktionieren. Es wird immer "Keine" ausgegeben.
Aran-Fey
Windows 10 hat für mich gut funktioniert, solange ich Python 32-Bit verwendet habe. Ich habe die Antwort aktualisiert, um auch mit 64-Bit zu arbeiten.
Kichik
Gehen Sie diesen Fehler "erwarteter Zeichenzeiger, habe int" in der Zeile "text = ctypes.c_char_p (data_locked)", irgendeine Idee?
txemsukr
Es wäre toll, eine ähnliche Lösung zu sehen, um Text auch in die Zwischenablage zu kopieren.
Mrkbutty
11

Die am besten bewertete Antwort oben ist so seltsam, dass sie einfach die Zwischenablage löscht und dann den Inhalt erhält (der dann leer ist). Sie können die Zwischenablage löschen, um sicherzustellen, dass ein Inhaltstyp der Zwischenablage wie "formatierter Text" Ihren Nur-Text-Inhalt, den Sie in der Zwischenablage speichern möchten, nicht "abdeckt".

Der folgende Code ersetzt alle Zeilenumbrüche in der Zwischenablage durch Leerzeichen, entfernt dann alle doppelten Leerzeichen und speichert den Inhalt schließlich wieder in der Zwischenablage:

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()
geboren
quelle
11

Ich fand heraus, dass dies der einfachste Weg war, von Python aus auf die Zwischenablage zuzugreifen:

1) Installieren Sie pyperclip: pip install pyperclip

2) Verwendung:

import pyperclip

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

# the type of s is string

Getestet unter Win10 64-Bit, Python 3.5 und Python 3.7.3 (64-Bit). Scheint auch mit Nicht-ASCII-Zeichen zu funktionieren. Zu den getesteten Zeichen gehören ± ° © appliance αβγθΔΨΦåäö

np8
quelle
ist es für 3.6 geeignet? es wird erfolgreich installiert , aber wenn verwendet Paste () Methode gibt mir Fehler: „von pyside Import Version als PYSIDE_VERSION # Analyse: ignorieren ModuleNotFoundError: Kein Modul‚pyside‘genannt“. Als ich versuchte, Pyside zu installieren, heißt es, dass es in 3.6
gaurav
Ja, es sollte unter Python 3.6 funktionieren, und ich habe gerade mit Python 3.7.4 (64-Bit) getestet. In der Datei setup.py des Pakets sollten keine Abhängigkeiten zu Pyside oder anderen Paketen vorhanden sein. Sind Sie sicher, dass der Befehl Einfügen versucht, Pyside zu verwenden?
np8
Ja, der Befehl Einfügen sucht nach Pyside und da Pyside nur bis zu Python 3.4 unterstützt, gibt es einen Fehler
gaurav
8

Die Python-Standardbibliothek macht es ...

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()
Paul Sumpner
quelle
3

Probieren Sie win32clipboard aus dem win32all-Paket aus (das wahrscheinlich installiert ist, wenn Sie ActiveState Python verwenden).

Siehe Beispiel hier: http://code.activestate.com/recipes/474121/

Eli Bendersky
quelle
3

Für mein Konsolenprogramm haben die Antworten mit tkinter oben bei mir nicht ganz funktioniert, da .destroy () immer einen Fehler ausgegeben hat:

Befehl "Ereignis" kann nicht aufgerufen werden: Anwendung wurde während der Ausführung zerstört ...

oder bei Verwendung von .withdraw () hat das Konsolenfenster den Fokus nicht zurückbekommen.

Um dies zu lösen, müssen Sie auch .update () vor .destroy () aufrufen. Beispiel:

# Python 3
import tkinter

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

Das r.withdraw () verhindert, dass der Frame für eine Millisekunde angezeigt wird, und wird dann zerstört, wodurch der Fokus wieder auf die Konsole gerichtet wird.

user136036
quelle
2

Verwenden Sie die Zwischenablage der Pythons-Bibliothek

Es wird einfach so verwendet:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  
Dan
quelle
8
Hierbei wird im Wesentlichen Pyperclip verwendet. Der gesamte Quellcode dieses Moduls lautet wörtlich : from pyperclip import copy, paste.
pbreach
1

Ein nicht sehr direkter Trick:

Verwenden Sie den Hotkey pyautogui:

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

Daher können Sie die Daten der Zwischenablage nach Belieben einfügen.

see2
quelle