Python

PythonでCSVファイルを扱うには?

PythonでCSVファイルを扱うには?
以前、ブラウザ操作の自動化で使っていた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より簡単に扱えるので、とてもありがたいです。

-Python
-, , , , , , , , , , , , , , , , ,