みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Pythonでクリップボードを操作して便利ツールを作る方法を初心者向けにお伝えしております。
前回の記事はコチラ。
pyperclipモジュールを使って、クリップボードからデータを取得する方法をお伝えしました。
その続きということで、クリップボードから取得したデータを加工して、その加工したテキストをクリップボードへコピーします。
では、Pythonでデータを加工してクリップボードにコピーする方法です。
行ってみましょう!
前回のおさらい
まず目的としていることですが、以下のような範囲をクリップボードにコピーします。
それをPythonで処理すると以下のように、ハイフンと半角スペースが各行の冒頭に挿入される、つまりMarkdownのリストにしたいのです。
それを目指して、前回作ったコードはコチラ。
import pyperclip
print(pyperclip.paste())
短い!
pyperclipモジュールをインストールして、クリップボードの内容を取得してprintするだけのプログラムでした。
そして、取得したデータは長いテキストになっていまして、以下のような内容になっています。
Pythonで標準ライブラリのモジュールをインポートして使ってみよう\r\nPythonでosモジュールのmkdir関数を使ってフォルダを作成する超簡単なプログラム\r\nPythonプログラミングの基本中の基本!forループによる繰り返しの作り方\r\nPythonでデータをまとめて取り扱う基本中の基本!リストの使い方とforループ\r\nPythonで指定したフォルダが存在しているかどうかを調べるos.path.existsの使い方\r\nPythonで条件分岐をする基本中の基本!if~else文の作り方\r\nPythonでテキストファイルを開いてデータを読み込む基本中の基本\r\nPythonで文字列を区切り文字や改行で分割してリスト化するsplitメソッドの使い方\r\nPythonで文字列のスペース・タブ・改行を取り除くstripメソッドの使い方\r\nPythonで開いたファイルのクローズを忘れやすい人のためのwith文の使い方\r\nPythonでcsvファイルからデータを読み込む最初の一歩\r\n
Windowsですので改行位置に「\r\n」つまりキャリッジリターンとラインフィード(CRLF)が挿入されているということですね。
今回は、この長~いテキストをリスト化することから進めていきます。
\r\nで区切ってリスト化する
前述のテキストを「\r\n」で区切って分割するというと、以前お伝えしたsplitメソッドが使えそうです。
splitメソッドは以下のように書いて、引数sepには区切り文字を指定します。すると、区切り文字で分割してリスト化します。
なんとなく引数に「\r\n」を指定したくなりますが、引数を省略の場合は空白文字(スペース、タブ、改行)で区切るように動作してくれるのを思い出しました。
いったん、引数なしでやってみましょうか。
まず、対象となる選択範囲をクリップボードにコピーして、以下のプログラムを実行します。
import pyperclip
print(pyperclip.paste().split())
すると、以下のような出力が得られます。
[‘Pythonで標準ライブラリのモジュールをインポートして使ってみよう’, ‘Pythonでosモジュールのmkdir関数を使ってフォルダを作成する超簡単なプログラム’, ‘Pythonプログラミングの基本中の基本!forループによる繰り返しの作り方’, ‘Pythonでデータをまとめて取り扱う基本中の基本!リストの使い方とforループ’, ‘Pythonで指定したフォルダが存在しているかどうかを調べるos.path.existsの使い方’, ‘Pythonで条件分岐をする基本中の基本!if~else文の作り方’, ‘Pythonでテキストファイルを開いてデータを読み込む基本中の基本’, ‘Pythonで文字列を区切り文字や改行で分割してリスト化するsplitメソッドの使い方’, ‘Pythonで文字列のスペース・タブ・改行を取り除くstripメソッドの使い方’, ‘Pythonで開いたファイルのクローズを忘れやすい人のためのwith文の使い方’, ‘Pythonでcsvファイルからデータを読み込む最初の一歩’]
お!ちゃんと「\r\n」で分割されてリスト化されていますね。CRLFでも引数なしでうまく分割してくれました。
もちろん、以下のように引数に「\r\n」を指定しても大丈夫です。
print(pyperclip.paste().split('\r\n'))
クリップボードにコピーするテキストを生成する
これでクリップボードからのデータ一行ずつを、リストの要素として確保できました。
リストの要素それぞれに処理をしていくとなると、以前お伝えしたforループを使うのがよさそうな気がします。
# 処理
この「# 処理」のところで、各要素の冒頭に「- 」(ハイフンと半角スペース)を追加するような処理を入れていきたいですね。
ところで、クリップボードから取得したデータは長~い文字列でしたよね。
ですから加工してクリップボードに戻すデータも長~い文字列である必要があります。
イメージとしては
Pythonで標準ライブラリのモジュールをインポートして使ってみよう\r\n- Pythonでosモジュールのmkdir関数を使ってフォルダを作成する超簡単なプログラム\r\n- Pythonプログラミングの基本中の基本!forループによる繰り返しの作り方\r\n- …
てな感じになるはずです。
てことは、先ほどのforループを使った処理は…以下のようにするとよさそうです。
import pyperclip
lines =pyperclip.paste().split()
text = ''
for line in lines:
text = text + '- ' + line + '\r\n'
print(text)
空の文字列が入った変数textを用意して、forループでリストから要素を一つずつ取り出すのですが、その冒頭に「- 」、末尾に「\r\n」を挿入します。
では、結果を見てみましょう。
いいですね。望み通りの結果になっていそうです。
pyperclip.copy関数でクリップボードへコピーする
では、いよいよこのデータをクリップボードへコピーして戻しましょう。
pyperclip.copy関数を使います。
書き方はこちら。
これで引数textに指定した文字列をクリップボードへコピーしてくれます。
プログラムは以下になります。
import pyperclip
lines =pyperclip.paste().split()
text = ''
for line in lines:
text = text + '- ' + line + '\r\n'
pyperclip.copy(text)
こちらを実行して、クリップボードの内容をテキストファイルに貼り付けてみますと…
バッチリMarkdownのリスト形式になっています。
まとめ
初心者向けのPythonでクリップボードを操作、今回はデータを加工してクリップボードへコピーをする方法でした。
pyperclipモジュールには
- クリップボードのデータをテキストとして取得するpaste関数
- 指定したテキストをクリップボードにコピーするcopy関数
の2つの関数しかありません。
使い方シンプルでよいですね。
さて、次回はこの応用でクリップボードの内容を番号付きリストに変換してみたいと思います。
どうぞお楽しみに!