2008-09-19 135 views
58

如何從python的(windows)剪貼板中讀取文本?如何從python的(windows)剪貼板中讀取文本?

+1

與[此問題](http://stackoverflow.com/q/579687/296974)相關。 – glglgl 2012-11-15 13:48:18

+0

在我的情況下,只有[dan](http://stackoverflow.com/users/2084578/dan)答案有效,它使用[clipboard](https://pypi.python.org/pypi/clipboard/0.0.4 )包。 – Soorena 2016-10-09 13:04:20

回答

66

您可以使用名爲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之後,請勿在 剪貼板上放置對象。

+3

你知道有沒有辦法使用'with'語句? – Norfeldt 2013-07-11 14:21:08

+3

值得注意的是,在py34中,win7,SetClipboardText在沒有先前調用EmptyClipboard的情況下不起作用 – CoderTao 2015-01-12 21:57:49

+0

如果您想要執行更復雜的操作從剪貼板中獲取HTML格式的內容。請參閱http://stackoverflow.com/questions/17298897/how-can-i-copy-from-an-html-file-to-the-clipboard-in-python-in-formatted-text – 2016-09-08 08:23:07

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

如果你不想安裝額外的軟件包,​​也可以完成工作。

import ctypes 

CF_TEXT = 1 

kernel32 = ctypes.windll.kernel32 
user32 = ctypes.windll.user32 

user32.OpenClipboard(0) 
if user32.IsClipboardFormatAvailable(CF_TEXT): 
    data = user32.GetClipboardData(CF_TEXT) 
    data_locked = kernel32.GlobalLock(data) 
    text = ctypes.c_char_p(data_locked) 
    print(text.value) 
    kernel32.GlobalUnlock(data_locked) 
else: 
    print('no text in clipboard') 
user32.CloseClipboard() 
18

你可以很容易地通過內置模塊Tkinter完成這基本上是一個GUI庫。此代碼創建一個空白小部件以從OS獲取剪貼板內容。

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

對於我控制檯程序以上Tkinter的答案也不太爲我工作,因爲.destroy()總是給一個錯誤,:

不能援引「事件」命令:應用程序在執行時被破壞...

或者當使用.withdraw()時,控制檯窗口沒有得到焦點。

要解決這個問題,您還必須在.destroy()之前調用.update()。例如:

# Python 3 
import tkinter 

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

的r.withdraw()防止從幀示出用於milisecond,然後它會被破壞給予焦點返回到控制檯。

2

使用蟒蛇庫Clipboard

它只是用這樣的:

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

我發現,這是擺脫蟒蛇訪問剪貼板最簡單的方法:

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。似乎也適用於非ASCII字符。 經測試的字符包括±°©©αβγθΔΨΦååöö

相關問題