Pythonから(Windows)クリップボードからテキストを読み取るにはどうすればよいですか?


回答:


102

あなたはと呼ばれるモジュールを使用することができます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」ステートメントを使用する方法があるかどうか知っていますか?
Norfeldt 2013

3
注目に値するのは、py34、win7では、SetClipboardTextは、EmptyClipboardの前の呼び出しなしでは機能しなかった
CoderTao

このモジュールは、HTML形式のコンテンツをクリップボードから取り出すなど、より複雑な操作を実行する場合に役立ちます。stackoverflow.com/questions/17298897/…を
xji

1
@Norfeldtネイティブな方法がない場合は、「with」をサポートする独自のカスタムオブジェクトを簡単に作成できます
Elijas

38

基本的にGUIライブラリである組み込みモジュールTkinterを使用して、これを簡単に行うことができます。このコードは、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

21

win32モジュールを使用するための多くの提案を見てきましたが、この投稿のように、Tkinterは私が見た中で最も短くて簡単な方法を提供します。

さらに、Tkinterはpython標準ライブラリにあります。


3
Tkinterを介してクリップボード値を取得するいくつかのコード:TkinterからのインポートTk [\ nl] r = Tk()[\ nl] result = r.selection_get(selection = "CLIPBOARD")[\ nl] r.destroy()
mgkrebbs 2014年

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では機能しないようです。常に「なし」と印刷されます。
アランフェイ、

Windows 32は、Python 32ビットを使用している限り、問題なく動作しました。64ビットでも動作するように回答を更新しました。
kichik

「text = ctypes.c_char_p(data_locked)」という行でこのエラー「予期されたcharポインター、get 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に適していますか?それが正常にインストールされているが、使用ペースト()メソッドは、それは私にエラーを与える:「PySideインポートからバージョン PYSIDE_VERSION番号分析として:ModuleNotFoundErrorを無視: 『PySide』という名前のないモジュールを」。私がPysideをインストールしようとしたとき、それは3.6ではサポートされていないと表示されます
gaurav

はい、Python 3.6で動作するはずです。Python3.7.4(64ビット)でテストしたところです。パッケージのsetup.pyを見ると、Pysideや他のパッケージへの依存関係はないはずです。貼り付けコマンドがPysideを使用しようとしていることを確認しますか?
np8

はい、pasteコマンドは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

私のコンソールプログラムの場合、.destroy()が常にエラーを出力するため、上記のtkinterでの回答はうまくいきませんでした:

「イベント」コマンドを呼び出せません:実行中にアプリケーションが破棄されました...

または.withdraw()を使用すると、コンソールウィンドウにフォーカスが戻りませんでした。

これを解決するには、.destroy()の前に.update()を呼び出す必要があります。例:

# Python 3
import tkinter

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

r.withdraw()は、フレームがミリ秒表示されないようにします。その後、フレームが破棄され、コンソールにフォーカスが戻ります。


2

Pythonライブラリのクリップボードを使用する

そのように単に使用されます:

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

8
これは本質的にpyperclipを使用しています。このモジュールのソースコード全体は、文字通り:from pyperclip import copy, pasteです。
違反

1

それほど直接的なトリックではありません:

pyautoguiホットキーを使用します。

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

したがって、クリップボードデータを好きなように貼り付けることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.