Pythonで(Windows)クリップボードからテキストを読み取るにはどうすればよいですか?
15 に答える
pywin32の一部であるwin32clipboardというモジュールを使用できます。
最初にクリップボード データを設定してから取得する例を次に示します。
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 を呼び出した後、オブジェクトをクリップボードに配置しないでください。
これは、基本的に GUI ライブラリである組み込みモジュールTkinterを介して簡単に実行できます。このコードは、OS からクリップボードの内容を取得するための空のウィジェットを作成します。
from tkinter import Tk # Python 3
#from Tkinter import Tk # for Python 2.x
Tk().clipboard_get()
Python からクリップボードにアクセスするには、pyperclipが最も簡単な方法であることがわかりました。
パイパークリップをインストールします。
pip install pyperclip
使用法:
import pyperclip
s = pyperclip.paste()
pyperclip.copy(s)
# the type of s is string
Windows、Linux、Mac をサポートし、非 ASCII 文字でも動作するようです。テスト済みの文字には、±°©©αβγθΔΨΦåäö が含まれます
win32 モジュールを使用するための多くの提案を見てきましたが、Tkinter は、この記事のように、私が見た中で最も短くて簡単な方法を提供しています。
さらに、Tkinter は python 標準ライブラリに含まれています。
余分なパッケージをインストールしたくない場合は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())
上記の最も賛成された答えは、クリップボードをクリアしてからコンテンツを取得するという点で奇妙です(その後は空になります)。クリップボードをクリアして、「フォーマットされたテキスト」などのクリップボードコンテンツタイプが、クリップボードに保存するプレーンテキストコンテンツを「カバー」しないようにすることができます。
次のコードは、クリップボードのすべての改行をスペースに置き換えてから、すべての二重スペースを削除し、最後にコンテンツをクリップボードに保存します。
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()
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()
Pythons ライブラリのクリップボードを使用する
次のように単純に使用されます。
import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()
win32allパッケージのwin32clipboardを試してください(ActiveState Pythonを使用している場合はおそらくインストールされています)。
こちらのサンプルをご覧ください:http://code.activestate.com/recipes/474121/
私のコンソール プログラムでは、.destroy() で常にエラーが発生したため、上記の tkinter を使用した回答はうまくいきませんでした。
「イベント」コマンドを呼び出せません: 実行中にアプリケーションが破棄されました...
または .withdraw() を使用すると、コンソール ウィンドウにフォーカスが戻りませんでした。
これを解決するには、.destroy() の前に .update() を呼び出す必要があります。例:
# Python 3
import tkinter
r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()
r.withdraw() は、フレームがミリ秒間表示されないようにし、その後破棄されて、コンソールにフォーカスが戻ります。
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 (ディストリビューションにも含まれています) よりも使いやすいと思います。