みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
非エンジニア&Windowsユーザー向けPythonでクリップボードを使った便利なツールを作るシリーズです。
前回の記事はコチラ。
クリップボードの内容を整形して、テキストファイルに書き込みをするプログラムを紹介しました。
今回は、それをちょっと発展させて、クリップボードの内容を出力する先を、csvファイルにしたいと思っております。
では、Pythonでcsvファイルにデータを書き込みをする基本中の基本。
行ってみましょう!
csvファイルに書き込みをする
以下の記事でもお伝えしております通り、Pythonではcsvを取り扱う際に便利なcsvモジュールというものがございます。
csvモジュールはPythonの標準ライブラリに含まれておりますので、スクリプトの先頭でインポートをするだけですぐに使えます。
Writerオブジェクト
前述の記事ででcsvファイルをReaderオブジェクトを使って読み込む方法をお伝えしたのですが、今度は書き込む方法ですので…そうです、Writerオブジェクトを使います。
Readerオブジェクトを生成するのと同様に、openしたファイルのファイルオブジェクトを渡して、以下のようにcsv.writer関数を使って生成します。
これでWriterオブジェクトが変数に格納されました。
writerowメソッドでcsvファイルに一行書き込む
Writerオブジェクトに対して、writerowメソッドを使うことで、csvファイルへの一行の書き込みができます。
writerowメソッドの引数はリストです。リストの内容をカンマ区切りでcsvファイルに書き込みます。
csvに書き込む際のopen関数
ではでは、これを使ってさっそくcsvファイルへの書き込みテストをしてみましょう。
こんなスクリプトを作ってみました。
import csv
with open('test.csv','a') as f:
writer = csv.writer(f)
writer.writerow([1,'スパム','500円'])
writer.writerow([2,'卵','168円'])
writer.writerow([3,'ベーコン','1,250円'])
まず、test.csvというファイルを追加書き込みモードで開きます。ファイルが存在しなければ、勝手に新規作成してくれます。
そして開いたtest.csvというファイルに、3つのリストをcsv化してその末尾に追加で書き込むというものですね。
これを実行してみると…
おや…一行空きになってしまいましたね。
Windowsではopen関数にnewlineパラメータが必要
実はWindowsでcsv.writerowメソッドを使う場合、ファイルを開く際のopen関数に一工夫が必要です。
引数としてnewlineというパラメータに空文字を渡す必要があります。
つまり、前述のスクリプトでいうと2行目のopen関数の箇所を以下のように変更する必要があるということですね。
with open('test.csv','a',newline='') as f:
では、これで実行をしてみましょう。
予定通り、一行空きはなくなりましたね。
あと、お気づきかと思いますが、「1,250円」がちゃんと一つのデータとして収まっていますね。
何も考えずにカンマだけを条件に分割するようなルーチンだと、ここも分割されてしまうのですが、csvモジュールを使えばちゃんとカンマをエスケープしてくれます。
便利ですね。
クリップボードの内容を追記していくスクリプト
では、これを応用して、前回作ったツールをcsvに書き込むようにカスタマイズしていきます。
前回作ったスクリプトはこちらです。
import pyperclip
lines =pyperclip.paste().split('\r\n')
text = ''
for i in range(0,len(lines),2):
text = '{0}{1}\t{2}\n'.format(text,lines[i],lines[i+1])
with open('methods.txt','a') as f:
f.write(text)
以下のページのメソッド一覧をクリップボードにコピーした際に、Excelに貼り付けたときに表形式に収まるように整形して、それをテキストファイルに書き出していくというものでした。
出力先をcsvファイルにする
そこそこ修正が必要ですが、以下のようなスクリプトになります。
import pyperclip,csv
lines =pyperclip.paste().split('\r\n')
with open('methods.csv','a',newline='') as f:
writer = csv.writer(f)
for i in range(0,len(lines),2):
writer.writerow([lines[i],lines[i+1]])
csvの書き込みの場合は、writerowメソッドで一行ずつ書き込んでいきますので、for文がwithブロック内に入りますね。
こちらを使ってcsvファイルに追記していくと、以下のようになります。
うん、いいですね。お仕事はかどりそうです。
まとめ
Pythonでcsvファイルにデータを書き込む基本中の基本についてお伝えしました。
csvモジュールを使えば書き込みも簡単にできますね。
Windowsの場合は、open関数にnewline=”を渡すのだけ気を付けましょう。
では、また次回、Pythonで便利ツールを作っていきたいと思います。
どうぞお楽しみに!