Làm cách nào để đọc văn bản từ khay nhớ tạm (windows) từ python?
Câu trả lời:
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.
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()
tkinter
thay vì Tkinter
. Othwise nó không hoạt động trên win10 python 3.7.3 64bit của tôi.
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.
Nếu bạn không muốn cài đặt các gói bổ sung, bạn ctypes
cũ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())
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 ± ° © αβγθΔΨΦåäö
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()
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()
Hãy thử win32clipboard từ gói win32all (có thể đã được cài đặt nếu bạn đang sử dụng ActiveState Python).
Xem mẫu tại đây: http://code.activestate.com/recipes/474121/
Đố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.
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()
from pyperclip import copy, paste
.