ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

[Python] 場合に応じて異なる関数を呼ぶ、をスッキリと

PySimpleGUI の Cookbook はとても勉強になるし、読んでいて楽しい。例えば、 "Recipe - Callback Function Simulation" の部分を読んでいて、なるほどなぁ、と思ったことがあった。

ある入力が受けて、その入力に応じた関数を呼ぶ、ということはよくある。イメージで言うと、変数event の値が "1" なら function1を、"2" なら function2を呼ぶ、と言うケース:

# 関数の定義
def function1():
	print("function1 is called")
def function2():
	print("function2 is called")

# なんらかの入力がある
event = "1"

# 場合分けで実行
if event == "1":
	function1()
elif event == "2":
	function2()

# event が "1" なので function1() が呼ばれる
# "function1 is called"

if とか elif とかで書いても問題なく動いてくれるのだけれども、もっとシンプルに書く方法が今回のお話。場合分けが多くなったりした時にもとても役に立つ。どうやるかというと、辞書(dictionary)を使う。入力と関数を辞書に入れておく:

# 関数の定義 (上と同じ)
def function1():
	print("function1 is called")
def function2():
	print("function2 is called")

# この辞書を作っておく
dispatch_dictionary = {"1":function1, "2":function2}

# なんらかの入力がある
event = "1"

# 場合分けで実行
if event in dispatch_dictionary:
	function_to_call = dispatch_dictionary[event]
	function_to_call()

# event が "1" なので function1() が呼ばれる
# "function1 is called"

function_to_call に function1 を一度入れておいて、それから () をつけてあげるとその関数を呼ぶことができる。

PySimpleGUIにはランチャーアプリを作って利用しているのだけれども、このやり方でコードがずいぶんスッキリしてくれた。

[Python] Ctrl + C (右クックからコピー) したものを取得する pyperclip

エクセルで保存した情報を簡単に処理して、その結果を社内のデータベースに転記する作業がある。そのデータベースのインターフェースはブラウザになっていて、恐ろしいことに(?)そのブラウザに表示される100~300くらいある(場合によってはもっとたくさんある)テキストボックス(inputで作られている)には、一括でエクセルのデータをコピペすることができないようになっている。なので、基本的には、100~300ある(場合によってはそれ以上の)テキストボックスには、エクセルの計算結果を一つずつコピペ、または、一つずつ手入力することが求められる設計となっている。

誰にとっても明白なように、一つずつコピペをしたり手入力するのは時間の浪費であるし、またミスの温床になりかねない。なので、ブラウザに入力するための別のエクセルを作成して、そこに一度計算結果をコピペして、そこからそのエクセルのVBAでブラウザに情報を渡すようにしている。

情報の処理・保存用のエクセル→→(コピーandペースト)→→ブラウザに情報を渡すVBAエクセル→→(VBA)→→ブラウザに入力完了

このVBAエクセルのおかげで作業はずいぶん楽になったのだけれども、やはりまだ辛い。結局、初めのエクセルから次のエクセルへコピペする作業は、文字通り「作業のための作業」であるからだ。ということで、少しでもこの作業を有意義なもの(?)にしようと考えて、少し調べてみたら、Python の pyperclip というライブラリーを使うとなんとかなりそうだと判明。pyperclip はコピーした文字列を取得できてしまう便利なライブラリ。新しいフローとしては:

情報の処理・保存用のエクセル→→(コピー and Python実行)→→ブラウザに入力完了
となり、少しだけ作業工程を減らすことができる。なお、"Python実行" のところでは pyperclip で情報を取得して、selenium で入力という流れ。

準備としては、まずはインストール。

pip install pyperclip
コピー(Ctrl+C、Cmd+C、右クリックからコピー)してクリップボードにある文字列を取得するには:
import pyperclip
pyperclip.paste()
でOK。例えば、エクセルで縦に1から4まで入力して、その範囲をコピーしてからpyperclip.pate()を使ってみる:
print(pyperclip.paste())
# 1
# 2
# 3
# 4
Windows なら改行は "\r\n" なので分割してリスト化もできる:
print(pyperclip.paste().split("\r\n"))
# ['1', '2', '3', '4', '']
最後の空が気になるので、シンプルに:
print(pyperclip.paste().split())
# ['1', '2', '3', '4']
のが簡単。

1列なら単に .split() でリスト化できるけれども、2列だと少し工夫(?)が必要。

エクセル上で1と5が横に並んでいるのは、"1\t5" というように、タブで区切られている。改行は上と同じ。なので、横に見て [[1,5],[2,6]...]というリストが欲しければ、まずは改行("\r\n")で区切り、それからタブ("\t")で区切ってあげれば良い:
print([i.split("\t") for i in pyperclip.paste().split("\r\n")])
# [['1', '5'], ['2', '6'], ['3', '7'], ['4', '8'], ['']]
やっぱり最後は空になってしまうので、if ではじいてあげる:
print([i.split("\t") for i in pyperclip.paste().split("\r\n") if len(i)>1])
# [['1', '5'], ['2', '6'], ['3', '7'], ['4', '8']]

pyperclipを使えば、一列のデータでも、2列(以上)のデータでも、コピーができるデータであれば簡単に取得して、リスト化ができると分かった。後は selenium に頑張ってもらってチクチク入力すれば完了。

[Python] Python + TreeTagger で英語の文に品詞アノテーションをする

前回の記事では、入力された英文を Python + TreeTagger で処理して、原形の情報を得ました。その過程で、入力された単語(そのままの形)と品詞の情報も得られますので、今回はそれらを使って、品詞アノテーションをします。

イメージとしては:

入力:"He has lots of books."
      ↓↓↓
出力:He_PP has_VHZ lots_NNS of_IN books_NNS ._SENT

それぞれの単語の後ろに、アンダーバー(_)と、品詞情報(PP, VHZなど)がくっついています。このように品詞情報を付与してコーパスを作成すると、より高度な検索などがしやすくなるようです。

line に入っている文が処理されますので、ダブルクオーテーションマークの中の文を分析したい文に変えてください。また、input() やコマンドライン引数を使うことで、より簡単に扱うこともできそうです。

なお、POS (品詞) がそれぞれどういう意味であるかは、TreeTaggerのページにある "tagset documentation" をクリックすることで確認することができます。

関連

[Python] Python + TreeTagger で英語の文の原形を得る

TreeTagger を Python で動かして、原形を得ます。

下のコードでは、例として "He has lots of books, and I have as many books." という文を処理しています。アウトプットとして、['he', 'have', 'lot', 'of', 'book', ',', 'and', 'I', 'have', 'as', 'many', 'book', '.'] と返ってきます。

なお、10行目の "line" に処理をする文を格納していますが、input()を使ったり、コマンドライン引数を使ったりすると、使い勝手も向上しそうです。

関連

[Car] クイック板金(2回目)

車のバンパーを擦ってしまった。。。ということで、 イエローハットのクイック板金 にお願いしていました。別の店舗に持って行っての作業ということで数日かかりましたが、無事に車が帰ってきました。結果、とても綺麗に直してもらい、非常に満足しています。板金をしたと言われても、素人目にはわか...