【问题标题】:How do I read text from the clipboard?如何从剪贴板读取文本?
【发布时间】:2010-09-11 04:42:41
【问题描述】:

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

【问题讨论】:

标签: python windows interop clipboard


【解决方案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 后的剪贴板。

【讨论】:

  • 你知道有没有办法使用 `with´ 语句?
  • 值得注意的是,在 py34、win7 中,如果没有事先调用 EmptyClipboard,SetClipboardText 将无法工作
  • 如果你想执行更复杂的操作,这个模块很有用,例如从剪贴板中获取 HTML 格式的内容。见stackoverflow.com/questions/17298897/…
  • @Norfeldt 如果没有原生方式,您可以轻松创建自己的支持“with”的自定义对象
  • 如果我尝试使用用 """ 定义的字符串变量复制多行文本,则无法正常工作
【解决方案2】:

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

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

【讨论】:

  • imo 比尝试安装 pywin32 好得多,因为这有很多已知问题。关于套管差异的好提示,一开始很难理解。
【解决方案3】:

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

  1. 安装 pyperclip: pip install pyperclip

  2. 用法:

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

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

【讨论】:

  • 适合3.6吗?它已成功安装,但是当使用 paste () 方法时,它给了我错误:“从 PySide 导入 version as PYSIDE_VERSION # analysis:ignore ModuleNotFoundError: No module named 'PySide'”。当我尝试安装 Pyside 时,它​​说 3.6 不支持它
  • 是的,它应该可以在 Python 3.6 上运行,我刚刚使用 Python 3.7.4(64 位)进行了测试。查看包的setup.py,它应该不依赖于 Pyside 或任何其他包。您确定粘贴命令正在尝试使用 Pyside?​​span>
  • 是的,粘贴命令正在寻找 Pyside,因为 Pyside 仅支持 python 3.4,它给出了错误
  • 我用 pip 安装了clipboard 包,它只有一行from pyperclip import copy, paste LOL。 pyperclib 是完美的解决方案。
  • pyperclip 也适用于 Mac 和 Linux(不仅仅是 Windows),这很好。
【解决方案4】:

我看到了很多使用 win32 模块的建议,但 Tkinter 提供了我见过的最短和最简单的方法,如在这篇文章中:How do I copy a string to the clipboard on Windows using Python?

另外,Tkinter 在 python 标准库中。

【讨论】:

  • 一些将通过 Tkinter 获取剪贴板值的代码: from Tkinter import Tk [\nl] r = Tk() [\nl] result = r.selection_get(selection = "CLIPBOARD") [\ nl] r.destroy()
  • 这当然很简单,但它可能会暂时改变窗口焦点,导致窗口闪烁。如果可用,可能值得为 win32clipboard 编码,如果没有,则回退到 Tkinter。
【解决方案5】:

如果您不想安装额外的软件包,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。它总是打印“无”。
  • 只要我使用 Python 32 位,Windows 10 就可以正常工作。我也更新了使用 64 位的答案。
  • 在“text = ctypes.c_char_p(data_locked)”这一行出现错误“expected char pointer, got int”,知道吗?
  • 很高兴看到将文本复制到剪贴板的类似解决方案。
  • 关于枚举其他可用剪贴板格式的任何提示?也许获取二进制/文件数据?
【解决方案6】:

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

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

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

【讨论】:

    【解决方案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()
    

    【讨论】:

    • 谢谢,为我工作,无需使用 3rd 方包。
    • 不错的解决方案。如果我们不需要 Tk GUI,最好在某个地方使用 root.quit()
    【解决方案8】:

    使用 Pythons 库Clipboard

    它的用法很简单:

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

    【讨论】:

    • 这本质上是使用pyperclip。这个模块的整个源代码字面意思是:from pyperclip import copy, paste.
    • 这是真的。然而他们是对的,clipboard 是一个更好的名字。这个函数应该包含在 Python 标准库中。
    • 这种包实在是太可惜了……一行代码只用了另一个包……
    【解决方案9】:

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

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

    【讨论】:

      【解决方案10】:

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

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

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

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

      # Python 3
      import tkinter
      
      r = tkinter.Tk()
      text = r.clipboard_get()
      r.withdraw()
      r.update()
      r.destroy()
      

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

      【讨论】:

        【解决方案11】:

        一个不是很直接的技巧:

        使用 pyautogui 热键:

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

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

        【讨论】:

          【解决方案12】:

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

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              【解决方案14】:

              为什么不尝试调用 powershell?

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

              【讨论】:

                【解决方案15】:
                import pandas as pd
                df = pd.read_clipboard()
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-08-13
                  • 2019-09-25
                  • 1970-01-01
                  • 2013-11-16
                  • 2023-01-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多