PythonでCSVファイルを読み込み・書き込み(入力・出力)

PythonでCSVファイルを読み込み・書き込み
スポンサーリンク
スポンサーリンク

Pythonで業務の自動化を行うためにはCSVファイルの操作が不可欠です。

この記事では、標準モジュールの csv でCSVファイルの読み込み・書き込みを行う方法を解説します。

スポンサーリンク

使用モジュール

モジュール :csv(公式ドキュメント
インストール:不要

Python標準モジュールの csv を利用します。インストールは不要です。

モジュールのインポート

csv モジュールをインポートします。

サンプルコードの中で二次元配列を表示するために、pprintモジュールも使用しています。

サンプルデータ

CSVファイルは以下のようなデータ seiseki.csv を使用します。

CSVファイルの読み込み(リスト型)

CSVファイルの読み込み・入力

CSVファイルの読み込みには csv.reader() クラスを使用します。
第一引数には open() 関数で開いたファイルオブジェクトを指定します。

readerオブジェクト = csv.reader(ファイルオブジェクト)

python実行ディレクトリにある kawa.csv を読み込みます。

reader オブジェクトはイテレータとなるため、for 文で行ごとに出力できます。
読み込まれた各行は、文字列のリストとして返されます。

csv.reader() で使用される主な引数は以下になります。

open() 関数でファイルを開くときは、引数に newline='' を付けておくと安全です。
デフォルト設定は newline = None ですが、\r\n, \rなどの改行コードが \n に自動変換されてしまい、意図しない場所で改行されてしまいます。

実行時に 'cp932' codec can't decode byte 0x8d in position 9 といったエラーが発生する場合は、ファイルのエンコード が utf-8 などで保存されている事が原因です。
open() 関数の引数に encoding='utf-8' 等、ファイルと同じエンコードを指定すると解消されます。

二次元配列で読み込み

1行ずつではなく、二次元配列として読み込む方法です。

リスト内包表記を使用することで、二次元配列で読み込むことができます。

リスト内リストの場合は以下のようになります。

数値データを浮動小数点として読み込む

csv.reader() で数字を読み込んでも、文字列として読み込まれます。

数値に変換したい場合は、int()float() で対象のデータを変換する必要があります。


他の方法として、csv.reader() の引数に quoting=csv.QUOTE_NONNUMERIC を指定することで
引用符のない数値は浮動少数点数として読み込むことができます。
ただし、floatに変換できない要素が引用符に囲まれていないとエラーとなるので注意が必要です。

サンプルとして文字列を 「””」 で囲んであるファイル kawa_quote.csv を読み込みます。

区切り文字を指定する

csv.reader() は通常、区切り文字は「,」(カンマ)として扱います。

他の区切り文字のファイルを読み込みたい場合は、引数に delimiter を指定します。

readerオブジェクト = csv.reader(ファイルオブジェクト, delimiter=区切り文字)

サンプルとして区切り文字がスペースのCSVファイル kawa_space.csv を読み込みます。

CSVファイルの読み込み(辞書型)

CSVファイルの読み込み・入力

csv.DictReader() クラスを使用すると、ファイルの内容を、ヘッダをキーとした辞書型で取得する事ができます。

readerオブジェクト = csv.DictReader(ファイルオブジェクト)

csv.reader と同様に reader オブジェクトはイテレータとなるため、for 文で行ごとに出力できます。

辞書型で読み込むと readerオブジェクト.fieldnames でカラム名の一覧が取得可能です。
また、カラム名を指定して出力することもできます。

二次元配列で読み込み

1行ずつではなく、二次元配列として読み込む方法です。

リスト内包表記を使用することで、二次元配列で読み込むことができます。

数値データを浮動小数点として読み込む


csv.reader() と同様に、引数に quoting=csv.QUOTE_NONNUMERIC を指定することで、引用符のない数値は浮動少数点数として読み込むことができます。

サンプルとして文字列を 「””」 で囲んであるファイル kawa_quote.csv を読み込みます。

区切り文字を指定する

csv.Dictreader() は通常、区切り文字は「,」(カンマ)として扱います。

他の区切り文字のファイルを読み込みたい場合は、引数に delimiter を指定します。

readerオブジェクト = csv.Dictreader(ファイルオブジェクト, delimiter=区切り文字)

サンプルとして区切り文字がスペースのCSVファイル kawa_space.csv を読み込みます。

CSVファイルの書き込み(リスト)

CSVファイルの書き込み・出力

CSVファイルの書き込みには csv.writer クラスの、writerow() メソッドを使用します。
対象のデータはリストで指定します。

writerオブジェクト = csv.writer(ファイルオブジェクト)
writerオブジェクト.writerow(リスト)

第一引数には open() 関数で開いたファイルオブジェクトを指定します。

新規作成の場合は、open()の第一引数に新規ファイルのパス、第二引数の書き込みモードに 'w' を指定します。
またWindows環境の場合は newline = '' を指定する必要があります。デフォルトは None ですが、これだと1行空白が空いてしまいます。

以下のようなファイルが出力されます。


既存ファイルに対して書き込みモードを 'w' とすると上書きされます。
既存ファイルに追記したい場合は、書き込みモードに 'a' を指定します。

以下のように3行目が追加されます。

二次元配列を書き込み

二次元配列のデータを、CSVファイルに複数行で書き込むには、writerows() メソッドを使用します。

writerオブジェクト = csv.writer(ファイルオブジェクト)
writerオブジェクト.writerows(リスト)

以下のファイルが出力されます。

区切り文字を指定

デフォルトではカンマ区切りのファイルが出力されます。
区切り文字を指定したい場合は、引数 delimiter で指定します。

引用符を追加する

書き込むデータに区切り文字を含む要素は、引用符で囲まれて書き込まれます。

引数 quoting で引用符の追加を指定する事ができます。デフォルトは quoting=csv.QUOTE_MINIMAL で、上の例のように、区切り文字を含む要素のみが引用符 "" で囲まれます。

全ての要素を引用符で囲む場合は quoting=csv.QUOTE_ALL 、数値以外を引用符で囲む場合は quoting=csv.QUOTE_NONNUMERIC を指定します。
また、引用符はデフォルトでは "" (ダブルクオーテーション)ですが、quotechar で他の文字を指定可能です。

CSVファイルの書き込み(辞書)

CSVファイルの書き込み・出力

辞書データを書き込むには、csv.DictWriter() クラスを使用します。

writeheader()メソッドで、fieldnames をヘッダーとして書き込ます。
行の書き込みは writerow() で、引数に辞書を指定します。

 writerオブジェクト = csv.Dictwriter(ファイルオブジェクト, fieldnames=ヘッダリスト)
 writerオブジェクト.writeheader()
 writerオブジェクト.writerow(辞書データ)

既存ファイルに追記したい場合は、書き込みモードに 'a' を指定します。
ヘッダは既に書き込まれているので、writer.writeheader() は不要です。

二次元配列を書き込み

二次元配列の辞書データを、CSVファイルに複数行で書き込むには、リストの場合と同様にwriterows() メソッドを使用します。

 writerオブジェクト = csv.Dictwriter(ファイルオブジェクト, fieldnames=ヘッダリスト)
 writerオブジェクト.writeheader()
 writerオブジェクト.writerow(辞書データ)


標準モジュールの csv でCSVファイルの読み込み・書き込みを行う方法を解説しました。

・関連記事:pandasでCSVファイルを読み込む方法(read_csv)
・関連記事:pandasでExcelファイルの読み込み(read_excel)
・関連記事:pandasでExcelファイルの書き込み(to_excel)