【Python】CSVファイルの書き込み
【コードと説明】
今回はライブラリの「csv」を使用しますので、インポートします。
import csv
ライブラリの「csv」はPythonに標準で入っているため、インストールの必要はありません。
<書き込み>
コード | 説明 |
---|---|
csv.writer(ファイル, delimiter=区切り文字) | 書き込みファイルの指定 |
.writerow(リスト) | リストを書き込み |
.writerows(2次元リスト) | 2次元リストの書き込み |
<リストの書き込み>
# csv.writer(ファイル, delimiter=区切り文字) # .writerow(リスト) import csv file_path = './test.csv' test = ['a', 'b', 'c', 13, 14] with open(file_path, mode='w') as f: writer = csv.writer(f, delimiter=',') writer.writerow(test)
最初にライブラリの「csv」をインポートしています。
「open」を使ってファイルを書き込みモードで開きます。
「writer」に「csv.writer」クラスを入れています。
引数にはファイルオブジェクト(今回だとファイルを「f」として開いているので「f」)と区切り文字として「delimiter=」で「,」を指定しています。
「.writerow」はリストを書き込むことができます。
作成されたファイルは下記になります。
# test.csv a,b,c,13,14
<2次元リストの書き込み>
# .writerows(2次元リスト) import csv file_path = './test.csv' test = [['a', 'b', 'c', 13, 14], ['d', 'e', 'f', 23, 24]] with open(file_path, mode='w') as f: writer = csv.writer(f, delimiter=',') writer.writerows(test)
「.writerow」は2次元リストの内部リストを1行として書き込みます。
書き込んだ結果が下記です。
# test.csv a,b,c,13,14 d,e,f,23,24
1行毎に書き込んでいるはずなのに間に空行ができてしまいました。
これは「open」の引数に「newline=""」を指定することで解決できました。
解決方法はこちらを参考にさせて頂きました。
import csv file_path = './test.csv' test = [['a', 'b', 'c', 13, 14], ['d', 'e', 'f', 23, 24]] with open(file_path, mode='w', newline="") as f: writer = csv.writer(f, delimiter=',') writer.writerows(test)
# test.csv a,b,c,13,14 d,e,f,23,24
【後書き】
今回は csv ファイルの書き込み方法についてメモしました。
途中空行ができてしまい思ったよりも時間がかかってしまいました。
次回は csv ファイルの読み込み方法について記載したいと思います。
【参考サイト】
今回の作業にあたり、下記サイトを参考にさせて頂きました。
note.nkmk.me
qiita.com
【Python】キーボード操作
【はじめに】
今回はPythonの「pyautogui」を使ったキーボード操作についてのメモです。
「pyautogui」のインストール方法については以下に記載してあります。
chappy88.hatenablog.com
<実施環境>
- Python 3.7.4
- PyCharm 2019.2
- PyAutoGUI 0.9.47
【コードと説明】
<一覧>
コード | 説明 |
---|---|
press(キー) | キーを押す |
keyDown(キー) | キーを押したままにする |
keyUp(キー) | キーを離す |
hotkey(キー1, キー2) | |
typewrite(キー(文字列)) | キーをタイプしていく |
<キーを押す>
# press(キー) import pyautogui pyautogui.press('a')
「press()」はキーを押すコマンドです。
上記の例では「a」のキーを押しています。
<キーを押したままにする・離す>
# keyDown(キー) # keyUp(キー) import pyautogui pyautogui.keyDown('ctrl') pyautogui.press('c') pyautogui.keyUp('ctrl')
「keyDown()」はキーを押したままにするコマンドです。
「keyUp()」は逆にキーを離すコマンドです。
上記の例では、「Ctrl」を押したままにする→「c」を押す→「Ctrl」を離す、でコピーのショートカットキーを再現しています。
同時押しでは「hotkey(キー1, キー2)」が使える様です。
下記例では同じ様にコピーのショートカットキーを再現できます。
# keyDown(キー) # keyUp(キー) import pyautogui hotkey('ctrl', 'c')
<キーをタイプしていく>
# typewrite(キー(文字列)) pyautogui.typewrite('asdfgh')
「typewrite()」は指定したキーを順番に押していきます。
<指定可能なキー一覧>
指定可能なキー入力は下記になります。
中にはどのキーに対応しているかわからないものもあるので、機会を見て対応表を作れればと思っています。
['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright']
【後書き】
キーボード操作をすることで、直接入力ができないファイルの入力もできるため便利だと思いました。
【参考サイト】
今回の作業にあたり、下記サイトを参考にさせて頂きました。
pyautogui.readthedocs.io
bttb.s1.valueserver.jp
【Python】スクリーンショットと画像位置の取得
【はじめに】
今回はPythonの「pyautogui」を使ったスクリーンショットの取り方についてのメモです。
「pyautogui」のインストール方法については以下に記載してあります。
chappy88.hatenablog.com
<実施環境>
- Python 3.7.4
- PyCharm 2019.2
- PyAutoGUI 0.9.47
【コードと説明】
<一覧>
コード | 説明 |
---|---|
screenshot(ファイル名) | スクリーンショットを取得 |
save(ファイル名) | スクリーンショットを保存する |
screenshot(region=取得範囲) | 範囲を指定してスクリーンショットを取得 |
locateCenterOnScreen(検索対象) | 検索対象と同じ画像がある場所を取得 |
<スクリーンショットの取得と保存>
# screenshot() # save(ファイル名) import pyautogui file_name = 'test.png' prtsc = pyautogui.screenshot() prtsc.save(file_name)
「screenshot()」でウインドウ全体の画像データを取得することができます。
データを格納した変数に対して「.save(ファイル名)」をつけることで画像データとして保存できます。
「screenshot(ファイル名)」でもファイルを保存することができます。
# screenshot(ファイル名)
import pyautogui
file_name = 'test.png'
prtsc = pyautogui.screenshot(file_name)
|
<スクリーンショットの範囲の指定>
# screenshot(region=取得範囲) import pyautogui file_name = 'test.png' prtsc_range = (100, 200, 300, 400) prtsc = pyautogui.screenshot(file_name, region=prtsc_range)
「screenshot()」に「region=(左上の x 座標, 左上の y 座標, x の長さ, y の長さ)」を与えることで、取得の範囲を指定できます。
<検索対象と同じ画像がある場所を取得>
# locateCenterOnScreen(検索対象) import pyautogui x, y = pyautogui.locateCenterOnScreen('フォルダ.png') print('x:{}\ny:{}'.format(x, y)) # => x:350 # y:29
「locateCenterOnScreen()」は画像ファイルと同じ画像がある場所の中心を取得します。
今回は、
を指定して、デスクトップ上のフォルダの位置を取得しました。
検索は左から右に上から順番に行なわれるようで、複数対象がある場合は先に見つかったもののみ値が返されます。
以下のように、「region=(左上の x 座標, 左上の y 座標, x の長さ, y の長さ)」を与えることで検索範囲の指定もできます。
import pyautogui prtsc_range = (100, 200, 300, 400) x, y = pyautogui.locateCenterOnScreen('フォルダ.png', region=prtsc_range) print('x:{}\ny:{}'.format(x, y)) # => x:350 # y:29
画面上に対象の画像がない場合は下記の様なエラーが出ます。
要因としては、実行時に画面上にその画像がないか、元になっているファイルが適切でないかなので、確認が必要です。
TypeError: 'NoneType' object is not subscriptable
【後書き】
今回は「pyautogui」でスクリーンショットの取り方と、画像の位置の取得方法を記載しました。
何かを起点にスクリーンショットを保存したり、対象のボタンを押すことができたりできるので、自動化にいろいろと使えそうです。
【参考サイト】
今回の作業にあたり、下記サイトを参考にさせて頂きました。
bttb.s1.valueserver.jp
【Python】open()のmodeについて
【はじめに】
今回はPythonの「open()」の引数「mode」についてのメモです。
「mode」の種類や使い方について、残しています。
<実施環境>
- Python 3.7.4
- PyCharm 2019.2
【コードと説明】
<一覧>
mode= | 説明 |
---|---|
r | 読み込み |
w | 書き込み(新規作成) |
a | 追加書き込み |
r+ | 既存ファイルの読み書き |
w+ | ファイルの読み書き(新規作成) |
a+ | 追記・読み書き |
t | テキストモード |
b | バイナリモード |
<共通>
今回は下記の内容の書かれた「text.txt」を使用していきます。
# text.txt aaa bbb ccc
<読み込み>
# r with open('./test.txt', mode='r') as f: s = f.read() print(s) # => aaa # bbb # ccc
「r」は読み取り専用の引数です。
ファイルがある場合のみ読み込むことができ、ファイルがない場合はエラーになります。
# ファイルがない場合 with open('./test.txt', mode='r') as f: s = f.read() print(s) # => Traceback (most recent call last): # File "D:/Python/EditDocumentProject/test.py", line 1, in <module> # with open('./test.txt', mode='r') as f: # FileNotFoundError: [Errno 2] No such file or directory: './test.txt'
# 書き込み処理を行なった場合 with open('./test.txt', mode='r') as f: f.write('ddd') print(s) # => Traceback (most recent call last): # File "D:/Python/EditDocumentProject/test.py", line 2, in <module> # with open('./test.txt', mode='r') as f: # FileNotFoundError: [Errno 2] No such file or directory: './test.txt'
<書き込み(新規作成)>
# w with open('./test.txt', mode='w') as f: f.write('ddd')
# 書き込み後の「test.txt」 ddd
「w」は書き込み専用の引数です。ファイルが存在しない場合は作成します。
ファイルが存在する場合、内容が上書きされます。
そのため、書き込み処理というよりは、新しいファイルを作り直すイメージです。
# 読み込みを行なった場合 with open('./test.txt', mode='w') as f: s = f.read() # => Traceback (most recent call last): # File "D:/Python/EditDocumentProject/test.py", line 2, in <module> # s = f.read() # io.UnsupportedOperation: not readable
<追加書き込み>
# a with open('./test.txt', mode='a') as f: f.write('\nddd')
# 書き込み後の「test.txt」 aaa bbb ccc ddd
「a」は追記する場合の引数です。
上記を見ると、「ddd」が追加されているのがわかります。
ファイルが存在しない場合は、新規作成します。
また、書き込み専用のため、読み込みを行なうとエラーになります。
# ファイルが存在しない場合 with open('./test.txt', mode='a') as f: f.write('ddd')
# 作成された「test.txt」 ddd
# 読み込みを行なった場合 with open('./test.txt', mode='a') as f: s = f.read() # => Traceback (most recent call last): # File "D:/Python/EditDocumentProject/test.py", line 3, in <module> # s = f.read() # io.UnsupportedOperation: not readable
<既存ファイルの読み書き>
# r+ # 読み込み with open('./test.txt', mode='r+') as f: s = f.read() print(s) # => aaa # bbb # ccc
「r+」は読み書きのできる引数です。
書き込み時は「w」の時のようにファイルそのものが変わるわけではなく、上書きになります。(頭の文字から書き変わっていく)
# 書き込み with open('./test.txt', mode='r+') as f: f.write('ddd')
# 書き込み後の「test.txt」 ddd bbb ccc
頭の「aaa」が「ddd」に書き換わっています。
# ファイルがない場合 with open('./test.txt', mode='r+') as f: s = f.read() # => Traceback (most recent call last): # File "D:/Python/EditDocumentProject/test.py", line 2, in <module> # with open('./test.txt', mode='r+') as f: # FileNotFoundError: [Errno 2] No such file or directory: './test.txt'
<ファイルの読み書き(新規作成)>
# w+ with open('./test.txt', mode='w+') as f: f.write('ddd')
# 書き込み後の「test.txt」 ddd
「w+」は「r+」と同じファイルの読み書きができる引数です。
しかし、「w+」は「w」と同様に新規ファイルの作成の様になっており、ファイルを開いた時点で中身は空の状態になっています。
with open('./test.txt', mode='w+') as f: s = f.read() print(s) # =>
上記の様に読み込みを行なうと、エラーにはなりませんが、中身は空になっています。(読み込みの使い道があるのか不明。)
<追記・読み書き>
# a+ with open('./test.txt', mode='a+') as f: f.write('\nddd')
# 書き込み後の「test.txt」 aaa bbb ccc ddd
「a+」も基本的に「a」の動作に加えて読み込みもできる引数です。
しかし、読み込みを行なっても内容は空であり、「w+」同様にいまいち使い方がわかりませんでした。
with open('./test.txt', mode='a+') as f: s = f.read() print(s) # =>
<テキストモードとバイナリモード>
# t with open('./test.txt', mode='rt') as f: s = f.read() print(s) # => aaa # bbb # ccc
# b with open('./test.txt', mode='rb') as f: s = f.read() print(s) # => b'aaa\r\nbbb\r\nccc'
「t」はテキストモード、「b」はバイナリモードになります。
「rt」や「wb」の様にして使います。
正直、現状ではあまり気にしなくて良さそうなのでここでは詳しい内容は調べないでおきます。
こちらのサイトにバイナリモードについての記載がありました。
【後書き】
今回は「open()」の引数「mode」についてメモしました。
本来は「encoding」についても記載しようと思っていましたが、奥が深く残すだけの知識には足りないと思ったため、やめました。
【参考サイト】
今回の作業にあたり、下記サイトを参考にさせて頂きました。
sites.google.com
www.sejuku.net
note.mu
www.not-enough.org
【Python】マウスを操作する
【準備】
今回の操作では「PyAutoGUI」というライブラリを使用するためインストールします。
PyCharmでの方法ですが、「設定」>「プロジェクト・インタープリター」から「+」を選択して「PyAutoGUI」を選択してインストールを行ないます。
設定は「Alt」+「Ctrl」+「S]で開きます。
【関数と説明】
<一覧>
関数 | 説明 |
---|---|
size() | 画面サイズを取得 |
position() | マウスの現在位置を取得 |
moveTo(x, y, duration=移動速度) | マウスを座標(x, y) に向けて移動 |
moveRel(x, y, duration=移動速度) | マウスを現在位置から(x, y)移動 |
click(x, y) | 座標(x, y)をクリック |
pyautogui.doubleClick(x,y) | 座標(x, y)をダブルクリック |
dragRel(x, y, duration=移動速度) | ドラックして(x, y)移動 |
<実践と説明>
<共通>
今回の関数はライブラリの「PyAutoGUI」を使用するためインポートが必要です。
import pyautogui
<画面サイズの取得>
# 画面サイズの取得 import pyautogui screensize = pyautogui.size() # => Size(width=1920, height=1080)
画面サイズを取得することができました。
「screensize.width」や「screensize.height」で数値を取得できます。
<マウスの現在位置の取得>
# マウスの現在位置の取得 import pyautogui mausePoint = pyautogui.position() # => Point(x=1817, y=42)
マウスの現在位置を取得できました。
「mausePoint.x」や「mausePoint.y」で数値を取得できます。
操作の際にはあまり使用しませんが、どこをクリックするかなどを確認する際に使えそうです。
<クリックとドラッグ>
# クリックとドラッグ import pyautogui pyautogui.click(1817, 42) pyautogui.doubleClick(1817, 42) pyautogui.dragRel(-100, 0)
残りは文章では表しにくかったので、記載例だけです。
先ほど「.position」で取得した箇所をクリック、ダブルクリックした後、左にドラッグを行なっています。
【後書き】
今回は簡単なマウス操作について、メモしました。
Pythonからでは操作できないアプリでも、マウスを使うことで操作できるため、幅が広がりそうです。
【参考サイト】
今回の作業にあたり、下記サイトを参考にさせて頂きました。
whitecat-student.hatenablog.com
www.lisz-works.com
【Python】文字操作
【コードと説明】
<一覧>
今回のコード一覧です。
コード | 説明 |
---|---|
ワード1 + ワード2 | ワード1とワード2がつなげる |
接続文字.join(ワード(リスト)) | 接続文字を間に入れてリスト内の文字をつなげる |
"ワード".split(区切り文字, 分割数) | 区切り文字でワードを左から分割数だけ分割 |
ワード.rsplit(区切り文字, 分割数) | 区切り文字でワードを右から分割数だけ分割 |
ワード.sprit(削除文字) | 削除文字を両端から削除 |
ワード.lsprit(削除文字) | 削除文字を左端から削除 |
ワード.rsprit(削除文字) | 削除文字を右端から削除 |
ワード[n-1] | ワードの n 文字目を取得 |
ワード[n-1:n-1+m] | ワードの n 文字目から m 文字を取得 |
ワード.replace(変換前, 変換後, 変換する個数) | ワードの変換前の文字を変換後の文字に個数分、左から置換する |
ワード.find(検索ワード, 検索位置) | 左から検索を始め、検索位置から右側の検索ワードの開始位置を取得 |
ワード.rfind(検索ワード) | 左から検索を始め、検索ワードの開始位置を取得 |
<文字の結合>
# ワード1 + ワード2 # 接続文字.join(ワード(リスト)) wordlist = ['a', 'b', 'c', 'd', 'e'] print('a' + 'b') # => ab print("_".join(wordlist)) # => a_b_c_d_e
<文字の分割>
# ワード.split(区切り文字, 分割数) # ワード.rsplit(区切り文字, 分割数) word = "This is a pen." s = "a_b_c_d_e" print(word.split()) # => ['This', 'is', 'a', 'pen.'] print(s.split("_")) # => ['a', 'b', 'c', 'd', 'e'] print(s.split("_", 3)) # => ['a', 'b', 'c', 'd_e'] print(s.rsplit("_", 2)) # => ['a_b_c', 'd', 'e']
区切り文字を省略すると「空白」で分割されます。
区切り数を省略すると全ての区切り文字の箇所で分割されます。
区切り数を指定する際は区切り文字の省略はできませんでした。
分割後は、リストとして出力されます。
<両端文字の削除>
# ワード.strip(削除文字) # ワード.lstrip(削除文字) # ワード.rstrip(削除文字) word = " is " s = "XXXAXXXAXXX" print('This' + word.strip() + 'pen') # => Thisispen print('This' + word.lstrip() + 'pen') # => Thisis pen print('This' + word.rstrip() + 'pen') # => This ispen print(s.strip("X")) # => AXXXA print(s.lstrip("X")) # => AXXXAXXX print(s.rstrip("X")) # => XXXAXXXA
削除文字を省略すると「空白」が削除されます。
削除文字を指定すると左端/両端/右端のその文字が削除されます。
<文字の取得>
# ワード[n-1] # ワード[n-1:n-1+m] word = 'abcdef' print(word[0]) #=>a print(word[3]) #=>d print(word[-1]) #=>f print(word[-3]) #=>d print(word[0:4]) #=>abcd print(word[3:]) #=>def print(word[-4:-1]) #=>cde print(word[-2:]) #=>ef print(word[:-4]) #=>ab
先頭の文字を0文字目とするため、n 文字目を取得するには n+1 の数値を入れる必要があります。
「-」を入れると後ろから何文字目を取得できます。この書き方では最後尾の文字が1になるため注意が必要です。
n 文字目から m 文字取得する書き方では[○:△]の時に、○文字目から△文字目未満をとってくるイメージです(先頭文字を0文字目として)。
△を省略すると、○文字目以降の文字全てを取得します。
○を省略すると、△文字目未満の文字を全て取得します。
<文字の置換>
# ワード.replace(変換前, 変換後, 変換する個数) word = 'abcdef def' print(word.replace('abc', 'aaa')) # => aaadef def print(word.replace('def', 'xyz')) # => abcxyz xyz print(word.replace('def', 'xyz', 1)) # => abcxyz def print(word.replace('hif', 'xyz', 1)) # => abcdef def
変換する個数を省略すると対象を全て変換します。
変換対象がない場合は何もおきません。
<文字の検索>
# ワード.find(検索ワード, 検索位置) # ワード.rfind(検索ワード) 後ろから検索 word = 'apple and ant' print(word.find('a')) # => 0 print(word.find('a', 1)) # => 6 print(word.find('f')) # => -1 print(word.find('a', 11)) # => -1 print(word.rfind('a')) # => 10
検索ワードがない場合には「-1」が返されます。
【後書き】
今回は簡単なPythonでの文字操作についてメモをしました。
Pythonでは他にもいろいろな文字操作方法がありそうですので、調べるたびにメモを増やしていきたいと思います。(多くなってきたら1つにまとめようと思います)
【参考サイト】
今回の作業にあたり、下記サイトを参考にさせて頂きました。
qiita.com
【Python】Excel操作 ファイル作成とセル値設定
【はじめに】
今回も個人的にも使用機会の多いExcelの操作方法について残しておきます。
今回は「openpyxl」を使ってのファイルの作成とセルへの値の入力方法についてです。
【コードと説明】
今回、説明を残しておくコード全体を記載します。
import openpyxl as xl # ファイル名の記載 fname = 'テスト.xlsx' # ブックの読み込み book = xl.load_workbook(fname) # セルの追加 book.create_sheet('newsheet') #共通処理 sheet = book['newsheet'] # セルに値を入れる sheet.cell(1, 1).value = 'A1' sheet.cell(column=2, row=1, value='B1') sheet['C1'] = 'C1' # ブックの保存 book.save('test.xlsx')
<処理の詳細>
「openpyxl」のインポートとブックの読み込み・保存
import openpyxl as xl # ファイル名の記載 fname = 'テスト.xlsx' # ブックの読み込み book = xl.load_workbook(fname) # ブックの保存 book.save('test.xlsx')
まずは「openpyxl」をインポートします。「openpyxl」を使う際は必ず必要になるため忘れないようにします。
「openpyxl」のインストール方法についてはこちらに記載してあります。
次に、ブックの読み込みを「 .load_workbook」で行っています。今回は「テスト.xlsx」を読み込んでいますが、特に読み込みたいファイルがなければ括弧内を空にすればオッケーです。
最後に「.save」でブックの保存を行っています。括弧内には保存ファイル名を記載します。読み込んだファイルに上書きしたい場合は同じファイル名を記載すればよいです。
ブックの読み込みと保存の間に処理を記載することで、エクセルファイルの加工が可能になります。
セル値の設定
# セルに値を入れる sheet.cell(1, 1).value = 'A1' sheet.cell(column=2, row=1, value='B1') sheet['C1'] = 'C1'
セルへの値の入れ方は、上記の3パターンがありました。筆者はVBAになれているので一番上の方法が合っていました。
【後書き】
今回は短いですが、Pythonでエクセルを処理するための基本的な方法を残しました。セルの塗りつぶしや、罫線を引くこともできるようなので、また使用する際に残していきたいと思います。
【参考サイト】
今回の作業にあたり、下記サイトを参考にさせて頂きました。
www.python-izm.com