Làm cách nào để đọc văn bản từ khay nhớ tạm (windows) từ python?


Câu trả lời:


104

Bạn có thể sử dụng mô-đun có tên win32clipboard , là một phần của pywin32 .

Đây là một ví dụ đầu tiên đặt dữ liệu khay nhớ tạm sau đó lấy nó:

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

Một lời nhắc quan trọng từ tài liệu:

Khi cửa sổ kiểm tra xong hoặc thay đổi khay nhớ tạm, hãy đóng khay nhớ tạm bằng cách gọi CloseClipboard. Điều này cho phép các cửa sổ khác truy cập vào khay nhớ tạm. Không đặt một đối tượng trên khay nhớ tạm sau khi gọi CloseClipboard.


6
Bạn có biết có cách nào để sử dụng câu lệnh `with´ không?
Norfeldt

3
Đáng chú ý, trong py34, win7, SetClipboardText không làm việc mà không có một cuộc gọi trước để EmptyClipboard
CoderTao

Mô-đun này hữu ích nếu bạn muốn thực hiện các thao tác phức tạp hơn, ví dụ: lấy nội dung có định dạng HTML ra khỏi khay nhớ tạm. Xem stackoverflow.com/questions/17298897/…
xji

2
@Norfeldt Nếu không có cách gốc, bạn có thể dễ dàng tạo đối tượng tùy chỉnh của riêng mình hỗ trợ "with"
Elijas

39

bạn có thể dễ dàng thực hiện điều này thông qua mô-đun tích hợp Tkinter về cơ bản là một thư viện GUI. Mã này tạo một widget trống để lấy nội dung khay nhớ tạm từ OS.

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

2
Vui lòng thêm nhận xét vào mã này, và (có thể) các liên kết tới tài liệu mới.
jb.

6
nên được tkinterthay vì Tkinter. Othwise nó không hoạt động trên win10 python 3.7.3 64bit của tôi.
jerik

21

Tôi đã thấy nhiều đề xuất để sử dụng mô-đun win32, nhưng Tkinter cung cấp phương pháp ngắn nhất và dễ nhất mà tôi đã thấy, như trong bài đăng này: Làm cách nào để sao chép một chuỗi vào khay nhớ tạm trên Windows bằng Python?

Thêm vào đó, Tkinter nằm trong thư viện tiêu chuẩn của python.


3
Một số mã sẽ nhận giá trị khay nhớ tạm qua Tkinter: từ Tkinter nhập Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()
mgkrebbs

18

Nếu bạn không muốn cài đặt các gói bổ sung, bạn ctypescũng có thể hoàn thành công việc.

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

Điều này dường như không hoạt động trên Windows 10. Nó luôn in "Không có".
Aran-Fey

Windows 10 hoạt động tốt với tôi miễn là tôi sử dụng Python 32-bit. Tôi đã cập nhật câu trả lời để làm việc với 64-bit.
kichik

gặp lỗi này "con trỏ char mong đợi, có int" trên dòng "text = ctypes.c_char_p (data_locked)", có ý kiến ​​gì không?
txemsukr

Sẽ thật tuyệt nếu bạn thấy giải pháp tương tự để sao chép văn bản vào khay nhớ tạm.
mrkbutty

14

Tôi phát hiện ra đây là cách dễ nhất để truy cập vào khay nhớ tạm từ python:

1) Cài đặt pyperclip: pip install pyperclip

2) Cách sử dụng:

import pyperclip

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

# the type of s is string

Đã thử nghiệm trên Win10 64-bit, Python 3.5 và Python 3.7.3 (64-bit). Có vẻ như cũng hoạt động với các ký tự không phải ASCII. Các ký tự đã kiểm tra bao gồm ± ° © αβγθΔΨΦåäö


nó có phù hợp với 3.6 không? nó được cài đặt thành công nhưng khi sử dụng phương thức paste (), nó cho tôi lỗi: "từ phiên bản nhập PySide dưới dạng PYSIDE_VERSION # phân tích: bỏ qua ModuleNotFoundError: Không có mô-đun nào có tên 'PySide'". Khi tôi thử cài đặt Pyside, nó nói rằng nó không được hỗ trợ trong 3.6
gaurav

Có, nó sẽ hoạt động trên Python 3.6 và tôi vừa thử nghiệm với Python 3.7.4 (64-bit). Nhìn vào setup.py của gói, nó không được phụ thuộc vào Pyside hoặc bất kỳ gói nào khác. Bạn có chắc chắn rằng lệnh dán đang cố gắng sử dụng Pyside?
np8

Có, lệnh dán đang tìm kiếm Pyside và vì Pyside chỉ hỗ trợ tối đa python 3.4 nên nó báo lỗi
gaurav

Có vẻ như đây là giải pháp đơn giản nhất cho WSL với python3.6
xuất hiện vào

11

Câu trả lời được ủng hộ nhiều nhất ở trên là lạ ở chỗ nó chỉ đơn giản xóa Clipboard và sau đó lấy nội dung (sau đó trống). Người ta có thể xóa khay nhớ tạm để đảm bảo rằng một số kiểu nội dung khay nhớ tạm như "văn bản có định dạng" không "che" nội dung văn bản thuần túy của bạn mà bạn muốn lưu trong khay nhớ tạm.

Đoạn mã sau thay thế tất cả các dòng mới trong khay nhớ tạm bằng khoảng trắng, sau đó xóa tất cả các khoảng trắng kép và cuối cùng lưu nội dung trở lại khay nhớ tạm:

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

7

Thư viện tiêu chuẩn python thực hiện điều đó ...

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

Đối với chương trình bảng điều khiển của tôi, các câu trả lời với tkinter ở trên không hoàn toàn phù hợp với tôi vì .destroy () luôn đưa ra lỗi,:

không thể gọi lệnh "event": ứng dụng đã bị hủy trong khi thực thi ...

hoặc khi sử dụng .withdraw () cửa sổ giao diện điều khiển không lấy lại được tiêu điểm.

Để giải quyết vấn đề này, bạn cũng phải gọi .update () trước .destroy (). Thí dụ:

# Python 3
import tkinter

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

R.withdraw () ngăn khung hình hiển thị trong một mili giây và sau đó nó sẽ bị phá hủy để đưa tiêu điểm trở lại bảng điều khiển.


2

Sử dụng Clipboard của thư viện Pythons

Nó được sử dụng đơn giản như thế này:

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

8
Đây thực chất là sử dụng pyperclip. Toàn bộ mã nguồn của module này là theo nghĩa đen: from pyperclip import copy, paste.
pbreach.

1

Một thủ thuật không trực tiếp lắm:

Sử dụng phím nóng pyautogui:

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

Do đó, bạn có thể dán dữ liệu khay nhớ tạm tùy thích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.