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


Answers:


103

您可以使用名为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后,请勿在剪贴板上放置任何对象。


6
您知道是否可以使用“ with”语句吗?
诺费尔德

3
值得注意的是,在py34,win7中,如果没有事先调用EmptyClipboard,SetClipboardText将无法工作
CoderTao 2015年

如果您想执行更复杂的操作,例如从剪贴板中获取HTML格式的内容,则此模块很有用。参见stackoverflow.com/questions/17298897/…–
xji

2
@Norfeldt如果没有本机方法,则可以轻松创建支持“ with”的自定义对象
-Elijas

38

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

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

2
请在此代码中添加注释,并(可能)添加到最新文档的链接。
jb。

5
应该tkinter代替Tkinter。在其他方面,它在我的python 3.7.3 64位win10上不起作用。
jerik '19


18

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

这似乎在Windows 10上不起作用。它始终显示“无”。
阿兰·菲

只要使用32位Python,Windows 10对我来说就可以正常工作。我更新了答案以使其也适用于64位。
kichik'1

在“文本= ctypes.c_char_p(data_locked)”行上出现此错误“期望的char指针,为int”,知道吗?
txemsukr

看到类似的解决方案也可以将文本复制到剪贴板,真是太好了。
mrkbutty

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

11

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

1)安装pyperclip: pip install pyperclip

2)用法:

import pyperclip

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

# the type of s is string

在Win10 64位,Python 3.5和Python 3.7.3(64位)上进行了测试。似乎也可以使用非ASCII字符。经过测试的字符包括±°©©αβγθΔΨΦåäö


它适合3.6吗?它已成功安装,但在使用paste()方法时却给我错误:“从PySide导入版本以PYSIDE_VERSION#analysis:ignore ModuleNotFoundError:没有名为'PySide'的模块。当我尝试安装Pyside时,它说它在3.6中不受支持
gaurav,

是的,它应该可以在Python 3.6上运行,而我刚刚使用Python 3.7.4(64位)进行了测试。查看软件包的setup.py,它应该与Pyside或任何其他软件包无关。您确定粘贴命令正在尝试使用Pyside吗?
np8

是的,粘贴命令正在寻找Pyside,并且由于Pyside仅支持python 3.4以上,因此会给出错误
gaurav,

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


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()会阻止框架显示一毫秒,然后框架将被破坏,从而将焦点移回控制台。


2

使用Pythons库剪贴板

它只是这样使用:

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

8
这实际上是使用pyperclip。这个模块的整个源代码是字面上:from pyperclip import copy, paste
pbreach

1

一个不是很直接的把戏:

使用pyautogui热键:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.