126

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

4

15 回答 15

126

您可以使用名为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 后不要在剪贴板上放置对象。

于 2008-09-19T11:20:29.610 回答
63

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

from tkinter import Tk  # Python 3
#from Tkinter import Tk # for Python 2.x
Tk().clipboard_get()
于 2014-05-24T11:58:36.800 回答
42

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

  1. 安装 pyperclip: pip install pyperclip

  2. 用法:

import pyperclip
    
s = pyperclip.paste()
pyperclip.copy(s)
    
# the type of s is string

支持 Windows、Linux 和 Mac,并且似乎也可以处理非 ASCII 字符。测试字符包括±°©©αβγθΔΨΦåäö

于 2016-07-03T15:54:43.620 回答
23

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

另外,Tkinter 在 python 标准库中。

于 2011-11-07T16:27:31.317 回答
21

如果您不想安装额外的软件包,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())
于 2014-04-25T05:54:12.243 回答
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()
于 2012-06-19T08:00:02.703 回答
10

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()
于 2018-04-04T08:42:51.753 回答
4

使用 Pythons 库剪贴板

它简单地像这样使用:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  
于 2016-04-27T10:19:44.400 回答
3

尝试使用 win32all 包中的 win32clipboard(如果您使用的是 ActiveState Python,则可能已安装)。

请参阅此处的示例:http: //code.activestate.com/recipes/474121/

于 2008-09-19T11:15:07.907 回答
3

对于我的控制台程序,上面 tkinter 的答案对我来说不太有效,因为 .destroy() 总是给出错误:

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

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

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

# Python 3
import tkinter

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

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

于 2015-01-17T01:08:26.063 回答
2

一个不是很直接的技巧:

使用 pyautogui 热键:

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

因此,您可以随意粘贴剪贴板数据。

于 2019-07-09T07:06:42.617 回答
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)
于 2021-04-29T19:17:06.127 回答
0

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

于 2021-12-06T16:14:31.760 回答
0

为什么不尝试调用powershell?

import subprocess

def getClipboard():
    ret = subprocess.getoutput("powershell.exe -Command Get-Clipboard")
    return ret
于 2022-02-18T05:36:05.433 回答
-1
import pandas as pd
df = pd.read_clipboard()
于 2021-12-07T04:21:57.837 回答