如何读取剪贴板上的文本?

如何使用 python 从(窗口)剪贴板读取文本?

159894 次浏览

尝试使用 win32all 包中的 win32clipboard (如果使用 ActiveStatePython,可能会安装这个包)。

参见样本: http://code.activestate.com/recipes/474121/

您可以使用名为 Win32剪贴板的模块,它是 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 之后的剪贴板。

我已经看到了许多使用 win32模块的建议,但 Tkinter 提供了我所见过的最短和最简单的方法,如本文所示: 如何使用 Python 将字符串复制到 Windows 上的剪贴板?

另外,Tkinter 在 python 标准库中。

上面最受欢迎的答案很奇怪,它只是简单地清除剪贴板,然后得到内容(然后是空的)。可以清除剪贴板,以确保某些剪贴板内容类型(如“格式化文本”)不会“覆盖”要保存在剪贴板中的纯文本内容。

下面的代码用空格替换剪贴板中的所有换行,然后删除所有的双空格,最后将内容保存回剪贴板:

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

如果您不想安装额外的软件包,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())

您可以通过内置模块 奇特轻松地完成这项工作,奇特基本上是一个 GUI 库。此代码创建一个空白小部件以从 OS 获取剪贴板内容。

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

对于我的 控制台程序控制台程序的答案与 tkinter 上面没有完全为我工作,因为。Delete ()总是给出一个错误:

无法调用“ event”命令: 应用程序在执行..。

或者当使用. pull ()时,控制台窗口没有重新获得焦点。

要解决这个问题,您还必须在. delete ()之前调用. update ():

# Python 3
import tkinter


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

Pull ()阻止帧在一毫秒内显示,然后它将被销毁,使焦点返回到控制台。

使用 Python 库 写字板

它的简单用法如下:

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

我发现 曲别针是从 python 访问剪贴板最简单的方法:

  1. 安装曲别针: pip install pyperclip

  2. 用法:

import pyperclip
    

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

# the type of s is string

With 支持 Windows、 Linux 和 Mac,似乎也可以使用非 ASCII 字符。 测试性状包括 ± ° αβγθΔγΦåäö

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

一个不太直接的把戏:

使用 pyautogui 热键:

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

因此,可以根据需要粘贴剪贴板数据。

经过整整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)

对于 Anaconda 的用户来说: 发行版本不会附带 pyperlip,但是他们会附带大熊猫来重新发行 pyperlip:

>>> 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更容易使用(它也包含在发行版中)。

import pandas as pd
df = pd.read_clipboard()

为什么不试着打电话给 Powershell?

import subprocess


def getClipboard():
ret = subprocess.getoutput("powershell.exe -Command Get-Clipboard")
return ret