如何从python中读取(windows)剪贴板中的文本?

时间:2008-09-19 11:09:27

标签: python windows

如何从python中读取(windows)剪贴板中的文本?

12 个答案:

答案 0 :(得分:82)

您可以使用名为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后的剪贴板。

答案 1 :(得分:22)

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

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

答案 2 :(得分:19)

我已经看到很多使用win32模块的建议,但是Tkinter提供了我见过的最简单,最简单的方法,如本文所述:How do I copy a string to the clipboard on Windows using Python?

另外,Tkinter位于python标准库中。

答案 3 :(得分:13)

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

答案 4 :(得分:11)

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

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

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

答案 5 :(得分:6)

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

1)安装pyperclip: pip install pyperclip

2)用法:

import pyperclip

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

# the type of s is string

在Win3 64位,Python 3.5上测试。似乎也适用于非ASCII字符。 经测试的字符包括±°©ααγθΔΨΦåäö

答案 6 :(得分:3)

尝试win32all包中的win32clipboard(如果你使用的是ActiveState Python,可能会安装它)。

请在此处查看示例:http://code.activestate.com/recipes/474121/

答案 7 :(得分:2)

对于我的控制台程序,上面使用tkinter的答案对我来说并不适用,因为.destroy()总是会出错:

  

无法调用“event”命令:应用程序在执行时已被销毁...

或使用.withdraw()时,控制台窗口无法获得焦点。

要解决此问题,您还必须在.destroy()之前调用.update()。例如:

# Python 3
import tkinter

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

r.withdraw()可以防止帧显示一个毫秒,然后它将被销毁,将焦点返回到控制台。

答案 8 :(得分:2)

使用Pythons库Clipboard

它的使用方式如下:

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

答案 9 :(得分:2)

python标准库做到了......

@Repository
public interface FooRepository extends JpaRepository<Foo, Id> {

    @Query("select f.game, sum(f.timeSpent) as duration from foo f  group by f.game order by duration desc")
    List<Foo> findMostPlayable();

}

答案 10 :(得分:1)

不是很直接的把戏:

使用pyautogui热键:

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

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

答案 11 :(得分:1)

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