Python でクリップボードを扱う方法についてまとめておきます。
画像とテキストのいずれでも保存するサンプルスクリプトを作成しています。
環境: Windows 10, Python 3 で動作確認をしています。また、PIL と pyperclip を使用しています。
背景
Python は、パソコンのクリップボードを自由に操作でき、とても便利です。
そこで、クリップボードを操作する典型的な Python のスクリプトについてまとめておきます。
概念的な説明よりも、まずは動かしてみるのが最も理解が早いです。
まずは末尾のサンプルコードを動かしてみてください。
ポイントとなる部分について説明をしています。うまく動いたら、使いたい部分を活用してみてください。
クリップボードを使う場合、画像と文字列を扱うケースがあると思います。
いずれも扱えるようまとめておきます。
サンプルコードの使い方:クリップボードからデータ取得
① PC にフォルダを作ってください。
② ①のフォルダに capture1.py の名前でテキストファイルを作成し、末尾に示したスクリプト全文をコピー&ペーストして保存してください。
③ PC上で、任意の文字列、または、画像をコピーしてください。
④ コマンドプロンプトから capture1.py を実行してください。
→ ①のフォルダ内に画像やテキストファイルが保存されます。
スクリプトの説明
クリップボードから画像を取得する
from PIL import ImageGrab, Image
im1 = ImageGrab.grabclipboard()
クリップボードから画像を取得するため、PIL から ImageGrab をインポートしています。ImageGrab.grabclipboard() で画像を取得できます。
クリップボードからテキスト/文字列を取得する
import pyperclip
str1 = pyperclip.paste()
str1 = str1.strip().replace( "\r\n", "\n" )
クリップボードから文字列を取得するため、PIL から pyperclip をインポートしています。pyperclip.paste() でテキストを取得できます。
Windows 10 ではクリップボードからテキストを保存する際、余計な文字 \r が入るので、replace を使って削除しています。
取得したデータを保存する
クリップボードから画像データやテキストデータを取得してしまいさえすれば、これ以降の保存は、Python の通常のスクリプトで実行できます。
具体的には、取得した画像データ im1 は、im1.save( file1 ) として保存しています。
取得したテキストデータ str1 は、別途、テキストを保存する関数 write1() を定義して保存しています。
クリップボードをクリアする(クリップボードにデータをコピーする)
pyperclip.copy("")
pyperclip.copy() は文字列をクリップボードにコピーするコマンドです。空欄 “” をクリップボードにコピーすることでクリップボードの内部を消去しています。
クリップボードにデータが残っていると、次回、プログラムを実行したとき、同じデータを保存する動きとなって違和感のある操作感となります。そこで、クリップボードからデータを取得して保存したら、データを消去するようにしています。
このコマンドで、空欄ではなく文字列を入れれば、文字列をコピーできることになります。また、文字列にタブや改行文字を入れれば、Excel などに表を貼りつけるなどの応用が可能となります。
まとめ
サンプルスクリプトに基づく形で、Python でクリップボードを扱う方法についてまとめました。
なお、ここでまとめたサンプルコードは、すでにクリップボード内にある画像とテキストを1回だけ保存する最もシンプルな事例です。
これに GUI を追加して、クリップボードを常時監視し、連続的に画像やテキストを自動保存できるようにしたアプリを以下の関連リンクにまとめています。
興味があるようでしたら参照してみてください。すぐに動くと思います。
関連リンク
・ 【Python】 クリップボード内の画像・テキストを自動保存する
サンプルコード:クリップボードの画像・テキストを保存
# -*- coding: utf-8 -*-
from PIL import ImageGrab, Image
import datetime as dt1
import pyperclip
import os
def capture1( path0 ):
ret1 = "0"
im1 = ImageGrab.grabclipboard()
str1 = pyperclip.paste().strip().replace( "\r\n", "\n" )
if str1 != "":
print( str1 )
file1 = str(path0) + "test1.txt"
write1( file1, str1 )
pyperclip.copy("")
ret1 = "1"
elif isinstance(im1, Image.Image):
file1 = str(path0) + "test1.jpg"
print( file1 )
im1.save( file1 )
pyperclip.copy("")
ret1 = "1"
return ret1
def write1( file1, str1 ):
with open( file1, 'w', encoding='utf-8' ) as f1:
f1.write( str1 )
return 0
path1 = os.path.dirname(__file__) + "\\"
capture1( path1 )