Wie lese ich Text aus der (Windows-) Zwischenablage von Python?
Wie lese ich Text aus der (Windows-) Zwischenablage von Python?
Antworten:
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.
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()
tkinterstatt sein Tkinter. Ansonsten funktionierte es auf meinem Python 3.7.3 64bit Win10 nicht.
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.
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())
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()
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 αβγθΔΨΦåäö
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()
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/
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.
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()
from pyperclip import copy, paste.