Help us understand the problem. What is going on with this article?

せっせとコピーしたテキストを、せっせと書き換える Python3+pyperclip

More than 1 year has passed since last update.

企画

コピーした文章を定期的に書き換えるという無駄を極めたプログラムが書きたくなったのでやってみる。
ソースコードがめちゃくちゃ短いので多分初心者向け。

手順を考える

  1. コピーされているテキストを取得
  2. 書き換える
  3. クリップボードに貼りつけ
  4. 定期的に繰り返す

ただし書き換える内容は一部だけにする。

環境

  • Windows10
  • Python 3.5.2 |Anaconda 4.2.0 (64-bit)

やってみよう!

pyperclipを使ってみる

まずクリップボードにコピーした文章を取得する。
これにはpyperclipを使えばいい。

コマンドプロンプト
pip install pyperclip 

とコマンドプロンプトに打ち込むとインストールできるはず。
先ほどの文章をコピーしてプログラムを実行してみよう。

sample01.py
import pyperclip, re

copy_text = str(pyperclip.paste())
print(copy_text)
実行結果
だが全てを書き換えてしまっては明らか過ぎて面白くない。
では一部だけ変更するようしてはどうだろうか。

コピーしたテキストを取得することには成功したので、逆にテキストをクリップボードにコピーしてみる。

sample02.py
copy_text = 'hello world!'

print(copy_text)
pyperclip.copy('\n'.join(copy_text))
実行結果
私の名前はAliceです
hello world!

書き換える

それではコピーしたテキストを書き換えていこう。

全てを変更すると面白くない(そもそもテキストを取得する必要すらない)ので、一部だけ変更したい。例えば数字。
数字が出てきたらランダムな数字に置き換えてしまおう。

コピーする文章は日本語である場合が多いと思うので、アルファベットも変更しよう。こちらは特定の文字列が出現したときのみ書き換えることにする。

sample03.py
import pyperclip, re

copy_text = str(pyperclip.paste())
print(copy_text)

new = re.sub(r'[\d]', '*', copy_text)
new = re.sub(r'day|best|hello', '****', new)

if len(copy_text) > 0:
    pyperclip.copy('\n'.join(new))
    print('Rewrite:', new)
else:
    print('Nothing')

re.subで文字列の置換。r' 'は正規表現。
本当はランダムな数字で置き換えたり、ランダムな文字列に変更したりを考えていたのだけれど、上手くいかなかった。きっと誰かがうまいこと考えてくれることを期待しよう。

実行結果
I will do my best day to day!
Rewrite: I will do my **** **** to ****!

ちなみにコピーした英文は「今日も一日頑張るぞい!」のGoogle翻訳。
NewGame二期楽しみだぞい。

定期的に起動

最後のオシゴト。
ThreadからThreadを実行することで5秒おきに実行することにする。
なお、前述までのプログラムを一部変更した。

copyChange.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

u"""Hoge クリップボードのテキストを勝手に書き換え
      例文:I will do my best day to day 2017!
"""

import pyperclip, re, threading, random


def task():
    copy_text = str(pyperclip.paste())

    new = re.sub(r'[\d]', str(random.randint(0, 9)), copy_text)
    new = re.sub(r'day|best|hello', '****', new)

    if len(copy_text) > 0:
        pyperclip.copy(''.join(new))
        print('---Rewrite Complete!---')
    else:
        print('---Failure---')
    th = threading.Timer(5, task)
    th.start()

t = threading.Thread(target=task)
t.start()

定期的に繰り返していることがわかるようにrandomを使って数字を変更するように書き換えた。同時に例文にも2017が追加されている。
また、実行するときにコピーした文章がprintされるのも邪魔なので消した。

実行結果
---Rewrite Complete!---
---Rewrite Complete!---
---Rewrite Complete!---
クリップボード
I will do my **** **** to **** 4444!
I will do my **** **** to **** 7777!
I will do my **** **** to **** 8888!

ここまでお疲れさまでした。

おまけ

このプログラムは起動しない限りクリップボードが書き換えられない。
そこでさらに凶悪度を増すために自動で起動させる方法を提示しておく。

今回はWindows想定なのでタスクスケジューラを使えばいい。
他のOSでもそれぞれ自動起動の方法があると思うため、自分のPCに苛められたい人はぜひ検索して試してみるといいだろう。
タスク スケジューラを起動する

コマンドプロンプトでもschtasksで出来るかも。
使ったことないしわからないけれど。

参考資料

お詫び

  • コードが正しく表示されていないという編集リクエストをいただきました。現在は修正済みです。kobitoでは表示されていても、Qiitaでは上手くいってないこともあるのですね。ご報告・訂正、ありがとうございました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした