月別アーカイブ: 2022年5月

PythonとSelenium ~ PC上のルーチンワークはPCにやらせよう

パソコン内の業務を自動化する取り組みのことをRPA(Robotic Process Automation)というそうです。自分は仕事でもPC、仕事以外の時間でもPCに向かっていることが多いので、いっそ、PCで行うことの全てをPCに自動的にやらせてしまえば、自分は仕事からも今の人生からも解放されるのではないかと思うことがあります。

セレニウムに関する書籍

セレニウムは、Pythonのモジュールの一つで、人間がウェブブラウザを開いてインターネットを閲覧したり、アイコンやリンクをクリックしたり、何かを入力したり実行ボタンを押したりするのと同じことを、機械的にやってくれます。使えればとっても便利なことは明らかなのですが、使い方を解説した本はまだ少ないようです。

  1. エキスパートが教えるSelenium最前線 (CodeZine BOOKS. SHOEISHA DIGITAL FIRST) 戸田広, 島根義和, 高橋陽太郎, 沖田邦夫, 松尾和昭, 宮田淳平 著. 翔泳社, 2018.5
  2. Selenium実践入門 : 自動化による継続的なブラウザテスト (WEB+DB PRESS plusシリーズ) 伊藤望, 戸田広, 沖田邦夫, 宮田淳平, 長谷川淳, 清水直樹, Vishal Banthia 著. 技術評論社, 2016.3
  3. Seleniumデザインパターン&ベストプラクティス  Dima Kovalenko 著, 太田健一郎, 玉川紘子 監訳, 笹井崇司 訳. オライリー・ジャパン, 2015.9
  4. 実践Selenium WebDriver  Satya Avasarala 著, 玉川竜司 訳. オライリー・ジャパン, 2014.9

研究者の場合、データベースにアクセスしてデータを収集することもあるかと思いますが、人間がウェブ操作するのと同じことをPythonのプログラムで実行できるので、Seleniumを使うと、煩雑なルーチンワークから解放されそうです。PubMedの検索を自動化して、結果をメールで返してもらったりとかできるかも。

 

参考

  1. 【学習ロードマップ付き】実例で理解するPythonで自動化できること5選! 吉池昌貴 2019年8月6日

PythonプログラミングでCSVファイルを開くときの文字コードエラーへの対処方法 UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0x89 in position 0: invalid start byte

【問題】PythonのJupyther Notebookでスクリプトを使ってエクセルファイルやCSVファイルを読もうとしたら、UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0x89 in position 0: invalid start byteというエラーが出ました。

【解決】エクセルファイルとCSVファイルでは文字コードが異なっていたようです。

if file.endswith(‘.xls’) | file.endswith(‘.xlsx’):
data = pd.read_excel(file, encoding = “shift-jis”)
elif file.endswith(‘.csv’) :
data = pd.read_csv(file, encoding = “cp932”)

とファイルの拡張子によって指定する文字コードも変えてやったら、問題なく読んでくれました。

 

pyothonでpandasのシリーズ(Series)の特定の要素のインデックスを取得する方法

シリーズの中のある要素が何番目かを知る方法。

 

#シリーズの中の特定の要素のインデックスを取得する方法

from pandas import Series

my_list = ['cell','gene','molecule','DNA','RNA']#リストの作成
my_series = Series(my_list)#リストからシリーズを作成
my_series[my_series=='DNA'].index[0]#特定の要素のインデックスを取得

 

上のコードを実行すると出力される結果は、3になります。DNAという文字列からなる要素が3番目(0から数え始めて)にあるので、3というわけです。

pythonのpandasのDataFrameで新しい列のデータを加える方法

pandasのDataFrameが以下のようになっていたとします。

import pandas as pd

dic ={ '名前' : ['太郎','花子','奈津子','夏子','なつみ'],
'数学' : [200,195,30,160,70],
'英語' : [120,180,90,161,111]}

df = pd.DataFrame(dic)

dfは、

名前 数学 英語
0 太郎 200 120
1 花子 195 180
2 奈津子 30 90
3 夏子 160 161
4 なつみ 70 111

ここに、列を挿入するには、

df.insert(1,'理科',[80,100,50,43,21])

とすれば、0列目の右側の1列目の位置に新しい列データを挿入できます。その結果、新しいデータフレームdfの内容は、

名前 理科 数学 英語
0 太郎 80 200 120
1 花子 100 195 180
2 奈津子 50 30 90
3 夏子 43 160 161
4 なつみ 21 70 111

となりました。

 

リストの要素の文字列が特定の文字で始まるときにその特定の文字を除去する方法

pythonで語句のリストがあったとき、特定の文字で始まる語句に関してその特定の文字を除去したいことがありあす。例えば、一部の語句はTheで始まるpythonのリスト [‘The pen’,’desk’, ‘The ink’]の場合に、どうやってこの中のTheを除去すればよいでしょうか。

以下のコードで実現できました。

# リストの要素の文字列がTheで始まる場合はそれを除去する

list = ['The pen','desk', 'The ink']
new_list = []

for element in list:
if element.startswith('The '):
sub0,sub1 = i.split('The ',1)
new_list = new_list+[sub1]
else:
new_list = new_list+[i]

print(list)
print(new_list)
動作の説明ですが、新しいリストを準備しておきます。

new_list = []

forループでリスト内の要素を一つずつチェック。’The ‘で始まる場合とそうでない場合で処理を分けます。’The ‘で始まる文字列に関しては、’The ‘の前後に分割。前は何もないのでカラの文字列になります(sub0)。後ろが自分が欲しい文字列(sub1)。sub1はストリングのデータタイプはストリングなので[]でリストにしてから、+という演算子でリスト同士を合わせます。上のコードを実行した結果は、

['The pen', 'desk', 'The ink']
['ink', 'The ink', 'ink']

で、うまく期待した動作をしてくれました。

註:このブログの記事内では、インデントがなくなってしまっています。forループの中身にはインデントが必要。さらにその中のif文およびelse文の中身もインデントが必要です。