以前、ブラウザ操作の自動化で使っていたiMacrosでは、CSVファイルを扱っていました。他のアプリと連携するのにCSVファイルが便利なのです。
じゃあ、PythonでCSVファイルを扱うにはどうしたらよいのか?
その方法をまとめてみました。
そもそもCSVファイルって?
「Comma Separated Values」の頭文字を取ったもので、テキストデータをカンマ区切りで保存するデータ形式です。
例えば、
名前,フリガナ,性別
〇〇,〇〇,〇〇
のように、保存されています。
表計算ソフトと相性が良いイメージがあります。
PythonでCSVファイルを扱うには?
まずはライブラリをインポートします。
ここでは標準ライブラリの「csv」で話を進めていきます。
import csv
次に扱うファイルを開きます。
今回は「file」と名付けた変数に入れています。
open()~close()を使う方法もありますが、with open():を使う方が1行で書けるため便利です。
withを使うときは、行末に「:(コロン)」、処理はタブインデントをつけて記述します。
# with を使う書き方
with open('test.csv', 'r') as file:
やりたい処理
# open()~close()を使う書き方
file = open('test.csv', 'r')
やりたい処理
file.close()
ちなみに、1つ目の引数はファイル名だけでなくパスも書けるので、実行するpyファイルと別のところに保存したり読み込んだりもできます。
CSVファイルに書き込むには?
ファイルを開くとき、open()の2つ目の引数に「'w'(上書き)」か「'a'(追加)」を指定します。
それから「csv.writer('ファイル名')」に対して「writerow()」か「writerows()」で書き込みます。
import csv
text = 'a','b','c'
texts = [
['d','e','f'],
['g','h','i']
]
with open('test.csv', 'w') as file:
csv.writer(file).writerow(text)
csv.writer(file).writerows(texts)
このコードを実行すると、pyファイルと同じフォルダにcsvファイルができます。
csv.writer()に関する詳細は公式ドキュメントをご覧ください。
CSVファイルを読み込むには?
open()の2つ目の引数に「'r'」を指定し、csv.reader()で読み込みます。
import csv
with open('test.csv', 'r') as file:
for a in csv.reader(file):
print(a)
# 出力結果
# ['a', 'b', 'c']
# ['d', 'e', 'f']
# ['g', 'h', 'i']
csv.reader()に関する詳細は公式ドキュメントをご覧ください
改行がおかしいときは?
私の環境では、CSVファイルに書き込むと余計な改行が入っていました。これには困ってしまいます。
解決方法は簡単。open()のオプションに「newline=''」を指定します。
これは公式ドキュメントの脚注で推奨されています。
ほかには、csv.writer()のオプションに「lineterminator=""」を指定する方法もあります。
先の書き込みコードを修正すると次の通りです。
import csv
text = 'a','b','c'
texts = [
['d','e','f'],
['g','h','i']
]
with open('test.csv', 'w',newline='') as file:
Writer = csv.writer(file)
Writer.writerow(text)
Writer.writerows(texts)
文字化けするときは?
連携させるアプリによって文字化けが起こる場合があります。
これは、CSVファイルの文字コードを指定することで解決できます。
文字コードの指定は、open()のオプション「encoding=''」を使います。
import csv
text = 'a','b','c'
texts = [
['d','e','f'],
['g','h','i']
]
with open('test.csv', 'w', encoding='utf8') as file:
Writer = csv.writer(file,lineterminator="")
Writer.writerow(text)
Writer.writerows(texts)
open()の詳細は公式ドキュメントをご覧ください。
「cp932」を含むエラー文が出たら?
CSVを読み込むと「UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence」と、いうエラーが出る場合があります。
原因は、CSVファイルの文字コードがPythonのデフォルト設定と違うから。
Pythonのデフォルト設定は、次のコードを実行して調べることができます。
import sys
print(sys.getdefaultencoding())
次に、open()のオプション「encoding=''」を使って文字コードを合わせればOKです。
まとめ
PythonでCSVファイルを扱うには、ライブラリをインポートしてから操作します。
iMacrosより簡単に扱えるので、とてもありがたいです。