Bagaimana cara membaca teks dari clipboard (windows) dari python?

97

Bagaimana cara membaca teks dari clipboard (windows) dari python?

Foo42
sumber
3
Terkait dengan pertanyaan ini .
glglgl
dalam kasus saya, hanya dan jawaban yang berhasil, yang menggunakan paket clipboard .
Soorena

Jawaban:

106

Anda dapat menggunakan modul bernama win32clipboard , yang merupakan bagian dari pywin32 .

Berikut adalah contoh yang pertama-tama menyetel data papan klip lalu mendapatkannya:

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

Pengingat penting dari dokumentasi:

Ketika jendela selesai memeriksa atau mengubah clipboard, tutup clipboard dengan memanggil CloseClipboard. Ini memungkinkan jendela lain untuk mengakses papan klip. Jangan letakkan objek di clipboard setelah memanggil CloseClipboard.

Sakin
sumber
6
Apakah Anda tahu jika ada cara untuk menggunakan pernyataan `with´?
Norfeldt
3
Perlu dicatat, di py34, win7, SetClipboardText tidak berfungsi tanpa panggilan sebelumnya ke EmptyClipboard
CoderTao
Modul ini berguna jika Anda ingin melakukan operasi yang lebih kompleks, misalnya mengeluarkan konten berformat HTML dari papan klip. Lihat stackoverflow.com/questions/17298897/…
xji
2
@Norfeldt Jika tidak ada cara asli, Anda dapat dengan mudah membuat objek kustom Anda sendiri yang mendukung "dengan"
Elijas Dapšauskas
43

Anda dapat dengan mudah menyelesaikan ini melalui modul Tkinter bawaan yang pada dasarnya merupakan pustaka GUI. Kode ini membuat widget kosong untuk mendapatkan konten clipboard dari OS.

#from tkinter import Tk  # Python 3
from Tkinter import Tk
Tk().clipboard_get()
kmonsoor
sumber
2
Silakan tambahkan komentar ke kode ini, dan (mungkin) tautan ke dokumentasi yang menyenangkan.
jb.
7
seharusnya tkinterbukan Tkinter. Jika tidak, itu tidak berfungsi pada python 3.7.3 64bit win10 saya.
jerik
21

Saya telah melihat banyak saran untuk menggunakan modul win32, tetapi Tkinter menyediakan metode terpendek dan termudah yang pernah saya lihat, seperti dalam posting ini: Bagaimana cara menyalin string ke clipboard di Windows menggunakan Python?

Plus, Tkinter ada di pustaka standar python.

Kancing 840
sumber
3
Beberapa kode yang akan mendapatkan nilai clipboard melalui Tkinter: dari Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()
mgkrebbs
18

Jika Anda tidak ingin menginstal paket tambahan, ctypesdapat menyelesaikan pekerjaan juga.

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
sumber
Ini sepertinya tidak bekerja pada Windows 10. Itu selalu mencetak "Tidak ada".
Aran-Fey
Windows 10 bekerja dengan baik untuk saya selama saya menggunakan Python 32-bit. Saya memperbarui jawaban untuk bekerja dengan 64-bit juga.
kichik
lakukan kesalahan ini "penunjuk karakter yang diharapkan, dapatkan int" di baris "text = ctypes.c_char_p (data_locked)", ada ide?
txemsukr
1
Akan sangat bagus untuk melihat solusi serupa untuk menyalin teks ke clipboard juga.
mrkbutty
18

Saya menemukan ini adalah cara termudah untuk mendapatkan akses ke clipboard dari python:

1) Pasang pyperclip: pip install pyperclip

2) Penggunaan:

import pyperclip

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

# the type of s is string

Diuji pada Win10 64-bit, Python 3.5 dan Python 3.7.3 (64-bit). Sepertinya bekerja dengan karakter non-ASCII juga. Karakter yang diuji meliputi ± ° © © αβγθΔΨΦåäö

np8
sumber
apakah itu cocok untuk 3.6? itu diinstal dengan sukses tetapi ketika digunakan paste () metode itu memberi saya kesalahan: "dari versi impor PySide sebagai PYSIDE_VERSION # analysis: abaikan ModuleNotFoundError: Tidak ada modul bernama 'PySide'". Ketika saya mencoba menginstal Pyside, ia mengatakan itu tidak didukung di 3.6
gaurav
Ya, ini seharusnya berfungsi pada Python 3.6, dan saya baru saja menguji dengan Python 3.7.4 (64-bit). Melihat setup.py dari paket itu seharusnya tidak memiliki ketergantungan ke Pyside atau paket lainnya. Apakah Anda yakin bahwa perintah tempel mencoba menggunakan Pyside?
np8
Ya, perintah tempel mencari Pyside dan karena Pyside hanya mendukung hingga python 3.4, ini memberikan kesalahan
gaurav
Tampaknya ini menjadi solusi paling sederhana untuk WSL dengan python3.6
diberlakukan
11

Jawaban yang paling banyak mendapat suara positif di atas adalah aneh karena ia hanya membersihkan Clipboard dan kemudian mendapatkan kontennya (yang kemudian kosong). Seseorang dapat menghapus papan klip untuk memastikan bahwa beberapa jenis konten papan klip seperti "teks berformat" tidak "menutupi" konten teks biasa yang ingin Anda simpan di papan klip.

Bagian kode berikut mengganti semua baris baru di papan klip dengan spasi, lalu menghapus semua spasi ganda dan terakhir menyimpan konten kembali ke papan klip:

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()
lahir
sumber
8

Pustaka standar python melakukannya ...

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
sumber
4

Gunakan Clipboard perpustakaan Pythons

Ini hanya digunakan seperti ini:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  
Dan
sumber
9
Ini pada dasarnya menggunakan pyperclip. Seluruh kode sumber dari modul ini secara harfiah: from pyperclip import copy, paste.
pbreach
itu benar. Bagaimanapun mereka benar itu clipboardadalah nama yang lebih baik. Fungsi ini harus dimasukkan dalam pustaka standar Python.
Vincenzooo
3

Untuk program konsol saya , jawaban dengan tkinter di atas tidak cukup berhasil untuk saya karena .destroy () selalu memberikan kesalahan ,:

tidak dapat menjalankan perintah "event": aplikasi telah dihancurkan saat menjalankan ...

atau saat menggunakan .withdraw () jendela konsol tidak mendapatkan fokus kembali.

Untuk mengatasi ini, Anda juga harus memanggil .update () sebelum .destroy (). Contoh:

# Python 3
import tkinter

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

R.withdraw () mencegah frame ditampilkan selama satu milidetik, dan kemudian akan dihancurkan dengan mengembalikan fokus ke konsol.

pengguna136036
sumber
1

Trik yang tidak terlalu langsung:

Gunakan hotkey pyautogui:

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

Oleh karena itu, Anda dapat menempelkan data papan klip sesuka Anda.

lihat2
sumber