如何使用 Python 从 Windows 剪贴板读取文本?
- 2025-01-08 08:50:00
- admin 原创
- 92
问题描述:
如何使用 python 从(Windows)剪贴板读取文本?
解决方案 1:
您可以使用名为win32clipboard的模块,它是pywin32的一部分。
下面是一个首先设置剪贴板数据然后获取数据的示例:
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
文档中的一个重要提醒:
当窗口检查或更改完剪贴板后,通过调用 CloseClipboard 关闭剪贴板。这样其他窗口就可以访问剪贴板了。调用 CloseClipboard 后不要将对象放在剪贴板上。
解决方案 2:
您可以通过内置模块Tkinter轻松完成此操作,该模块基本上是一个 GUI 库。此代码创建一个空白小部件以从操作系统获取剪贴板内容。
from tkinter import Tk # Python 3
#from Tkinter import Tk # for Python 2.x
Tk().clipboard_get()
解决方案 3:
我发现pyperclip是从 python 访问剪贴板的最简单方法:
安装 pyperclip:
pip install pyperclip
用法:
import pyperclip
s = pyperclip.paste()
pyperclip.copy(s)
# the type of s is string
Pyperclip 支持 Windows、Linux 和 Mac,似乎也适用于非 ASCII 字符。已测试的字符包括 ±°©©αβγθΔΨΦåäö
解决方案 4:
如果你不想安装额外的软件包,ctypes
也可以完成这项工作。
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())
解决方案 5:
我见过很多使用 win32 模块的建议,但是 Tkinter 提供了我见过的最短、最简单的方法,如在这篇文章中:如何使用 Python 将字符串复制到 Windows 上的剪贴板?
另外,Tkinter 位于 Python 标准库中。
解决方案 6:
上面得票最多的答案很奇怪,因为它只是清除剪贴板,然后获取内容(然后内容为空)。可以清除剪贴板,以确保某些剪贴板内容类型(如“格式化文本”)不会“覆盖”您想要保存在剪贴板中的纯文本内容。
下面这段代码将剪贴板中的所有换行符替换为空格,然后删除所有双空格,最后将内容保存回剪贴板:
import win32clipboard
win32clipboard.OpenClipboard()
c = win32clipboard.GetClipboardData()
win32clipboard.EmptyClipboard()
c = c.replace('
', ' ')
c = c.replace('
', ' ')
while c.find(' ') != -1:
c = c.replace(' ', ' ')
win32clipboard.SetClipboardText(c)
win32clipboard.CloseClipboard()
解决方案 7:
Python 标准库可以做到这一点......
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()
解决方案 8:
对于我的控制台程序,上面使用 tkinter 的答案对我来说不太适用,因为 .destroy() 总是给出错误:
无法调用“事件”命令:应用程序在执行时已被破坏......
或者当使用 .withdraw() 时控制台窗口没有重新获得焦点。
为了解决这个问题,你还必须在 .destroy() 之前调用 .update()。例如:
# Python 3
import tkinter
r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()
r.withdraw() 会阻止帧显示一毫秒,然后它将被销毁并将焦点返回到控制台。
解决方案 9:
为什么不尝试调用 powershell?
import subprocess
def getClipboard():
ret = subprocess.getoutput("powershell.exe -Command Get-Clipboard")
return ret
解决方案 10:
使用 Python 的剪贴板库
它的用法很简单,如下:
import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()
解决方案 11:
尝试使用 win32all 包中的 win32clipboard(如果您使用的是 ActiveState Python,则可能已安装)。
请参阅此处的示例:http: //code.activestate.com/recipes/474121/
解决方案 12:
import pandas as pd
df = pd.read_clipboard()
解决方案 13:
经过整整 12 年,我终于找到了解决方案,您无需安装任何软件包即可使用它。
from tkinter import Tk, TclError
from time import sleep
while True:
try:
clipboard = Tk().clipboard_get()
print(clipboard)
sleep(5)
except TclError:
print("Clipboard is empty.")
sleep(5)
解决方案 14:
一个不太直接的技巧:
使用 pyautogui 热键:
Import pyautogui
pyautogui.hotkey('ctrl', 'v')
因此,您可以随意粘贴剪贴板数据。
解决方案 15:
对于 Anaconda 用户:发行版不附带 pyperclip,但它们附带重新分发 pyperclip 的 pandas:
>>> from pandas.io.clipboard import clipboard_get, clipboard_set
>>> clipboard_get()
'from pandas.io.clipboard import clipboard_get, clipboard_set'
>>> clipboard_set("Hello clipboard!")
>>> clipboard_get()
'Hello clipboard!'
我发现它比 pywin32(也包含在发行版中)更容易使用。