Python入門
第22回.CSV読み書き(csvモジュール)

Pythonの初心者向け入門解説、人気のプログラミング言語Python
最終更新日:2020-09-29

第22回.CSV読み書き(csvモジュール)


Pyhton CSV読み書き

Pythonの標準ライブラリのcsvモジュールを使いCSVファイルを読み書きします。
前回の続きとしてcsvの書き込みをやります。

第21回.CSV読み込みとopen()関数とwith文
Pythonの標準ライブラリのcsvを使いCSVファイルを読み込みます。ファイルをオープンするにはopen()関数を使いますが、このときwith文を使うととても便利です。open()関数の仕様を確認してから、with文の使い方、そしてCSVの読み込みと順に解説していきます。

csvモジュールのより詳細な解説をします。
そして、フォルダ内の複数csvを一つにまとめたcsvを出力するスクリプ作成へと進みます。



目次

csvモジュールの仕様

csvモジュールは、CSV 形式で書かれたテーブル状のデータを読み書きするためのクラスを実装しています。
公式ドキュメント - csv --- CSV ファイルの読み書き

このモジュールを使うことで、プログラマは Excelで使われているCSV形式に関して詳しい知識をもっていなくても、
"このデータを Excel で推奨されている形式で書いてください"とか
"データを Excel で作成されたこのファイルから読み出してください" と言うことができます。
プログラマはまた、他のアプリケーションが解釈できる CSV形式を記述したり、独自の特殊な目的をもったCSV形式を定義することができます。

一通り公式ドキュメントを見た後で、追加説明とサンプルコードを見ていきます。

以下の一覧は公式ドキュメントからの抜粋を整形したものです。
リンクは公式ドキュメントにリンクしています。

csvモジュールの関数

関数説明
readercsv.reader(csvfile,dialect='excel',**fmtparams)
与えられたcsvfile内の行を反復処理するような reader オブジェクトを返します。
writercsv.writer(csvfile,dialect='excel',**fmtparams)
ユーザが与えたデータをデリミタで区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。
register_dialectcsv.register_dialect(name[,dialect[,**fmtparams]])
dialectをnameと関連付けます。
unregister_dialectcsv.unregister_dialect(name)
nameに関連づけられた表現形式を表現形式レジストリから削除します。
get_dialectcsv.get_dialect(name)
nameに関連づけられた表現形式を返します。
list_dialectscsv.list_dialects()
登録されている全ての表現形式を返します。
field_size_limitcsv.field_size_limit([new_limit])
パーサが許容する現在の最大フィールドサイズを返します。

csvモジュールのクラス

クラス説明
DictReaderclass csv.DictReader(f,fieldnames=None,restkey=None,restval=None,dialect='excel',*args,**kwds)
通常のリーダーのように動作するオブジェクトを作成しますが、各行の情報をdictにマッピングします。
DictWriterclass csv.DictWriter(f,fieldnames,restval='',extrasaction='raise',dialect='excel',*args,**kwds)
通常の writer のように動作しますが、辞書を出力行にマップするオブジェクトを生成します。
Dialectclass csv.Dialect
Dialectクラスはコンテナクラスで、基本的な用途としては、その属性を特定のreaderやwriterインスタンスのパラメータを定義するために用います。
excelclass csv.excel
excelクラスは Excel で生成される CSV ファイルの通常のプロパティを定義します。
これは 'excel' という名前の dialect として登録されています。
excel_tabclass csv.excel_tab
excel_tabクラスは Excel で生成されるタブ分割ファイルの通常のプロパティを定義します。
これは 'excel-tab' という名前の dialect として登録されています。
unix_dialectclass csv.unix_dialect
unix_dialectクラスは UNIX システムで生成される CSV ファイルの通常のプロパティ (行終端記号として'\n'を用い全てのフィールドをクォートするもの) を定義します。
これは 'unix' という名前の dialect として登録されています。
Snifferclass csv.Sniffer
Snifferクラスは CSV ファイルの書式を推理するために用いられるクラスです。

csvモジュールの定数

定数 説明
csv.QUOTE_ALLwriterオブジェクトに対し、全てのフィールドをクオートするように指示します。
csv.QUOTE_MINIMALwriterオブジェクトに対し、delimiter、quotecharまたはlineterminatorに含まれる任意の文字のような特別な文字を含むフィールドだけをクオートするように指示します。
csv.QUOTE_NONNUMERICwriterオブジェクトに対し、全ての非数値フィールドをクオートするように指示します。
csv.QUOTE_NONEwriterオブジェクトに対し、フィールドを決してクオートしないように指示します。

Dialectの属性 説明
delimiterフィールド間を分割するのに用いられる 1 文字からなる文字列です。
デフォルトでは','です。
doublequoteフィールド内に現れたquotecharのインスタンスで、クオートではないその文字自身でなければならない文字をどのようにクオートするかを制御します。
Trueの場合、この文字は二重化されます。
Falseの場合、escapecharはquotecharの前に置かれます。
デフォルトではTrueです。
escapecharwriter が、quotingがQUOTE_NONEに設定されている場合にdelimiterをエスケープするため、および、doublequoteがFalseの場合にquotecharをエスケープするために用いられる、 1 文字からなる文字列です。読み込み時にはescapecharはそれに引き続く文字の特別な意味を取り除きます。
デフォルトではNoneで、エスケープを行ないません。
lineterminatorwriterが作り出す各行を終端する際に用いられる文字列です。
デフォルトでは'\r\n'です。
quotechardelimiterやquotecharといった特殊文字を含むか、改行文字を含むフィールドをクオートする際に用いられる 1 文字からなる文字列です。
デフォルトでは'"'です。
quotingクオートがいつ writer によって生成されるか、また reader によって認識されるかを制御します。
QUOTE_*定数のいずれか (モジュールコンテンツ節参照) をとることができ、デフォルトではQUOTE_MINIMALです。
skipinitialspaceTrueの場合、delimiterの直後に続く空白は無視されます。
デフォルトではFalseです。
strictTrueの場合、 不正な CSV 入力に対してErrorを送出します。
デフォルトではFalseです。


dialectについて

dialectの指定方法は公式ドキュメントを読んでも少々難解に感じます。
以下、単純化した説明です。

csv.reader(csvfile,dialect='excel',**fmtparams)

登録されているdialectを使う

dialectには、先の「csvモジュールのクラス」この中の、
「dialect として登録されています。」と書かれている以下の3つのどれかを指定します。
'excel'
'excel-tab'
'unix'

Python CSV open()関数 with文
ANSI(shift-jis)です。
from pprint import pprint
import csv
with open("./test/file01.txt", "r", encoding="shift-jis") as f:
    reader = csv.reader(f, dialect='excel-tab')
    row = [r for r in reader]
pprint(row, width=20)
Pyhton CSV読み書き

dialectを自作する場合

独自のdialectを作成できます。
:コロン区切りで読み込む例です。

Pyhton CSV読み書き
UTF-8(BOMなし)です。
import csv
csv.register_dialect("colon", delimiter=':')
with open('./test.csv', 'r', encoding="utf-8") as f:
    reader = csv.reader(f, dialect='colon')
    [print(r) for r in reader]
Pyhton CSV読み書き


**fmtparamsについて

**fmtparamsの指定方法は公式ドキュメントを読んでも少々難解に感じます。
以下、単純化した説明です。

csv.reader(csvfile,dialect='excel',**fmtparams)

**fmtparamsは可変長のキーワード引数です。
ここには上に掲載した「Dialectクラスと書式化パラメータ
delimiter
doublequote
escapechar
lineterminator
quotechar
quoting
skipinitialspace
strict

これらのキーワードを使ったパラメーターを指定します。

:コロン区切りで読み込む例です。

Pyhton CSV読み書き
UTF-8(BOMなし)です。
import csv
with open('./test.csv', 'r', encoding="utf-8") as f:
    reader = csv.reader(f, delimiter=':')
    [print(r) for r in reader]
Pyhton CSV読み書き


CSV読み込みの基本

csv.readerを使った場合と、csv.DictReaderを使った場合のスクリプトのサンプルです。
以下のファイルを読み込んだ場合の結果を表示しています。

Pyhton CSV読み書き
UTF-8(BOMなし)です。

※PowerShellまたはコマンド プロンプトで実行する場合に、相対パスでは上手く読み込めない場合は絶対パスを指定してください。

csv.reader

これは前回から何度も使って来たものです。
from pprint import pprint
import csv
with open("./test/file01.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    row = [r for r in reader]
pprint(row, width=20)
Pyhton CSV読み書き

csv.DictReader

dict型で読み込みます。
from pprint import pprint
import csv
with open("./test/file01.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    row = [r for r in reader]
pprint(row, width=50)
Pyhton CSV読み書き

列名でCSVを編集する場合はこれを使うと便利です。

CSV書き込みの基本

csv.writer

1行ずつ出力します。
from pprint import pprint
import csv
csvlist = [['列1', '列2', '列3'],
          ['11', '12', '13'],
          ['A1', 'B1', 'C1'],
          ['あ1', 'い1', 'う1']]
with open("./test/file01.csv", "w", encoding="utf-8") as f:
    writer = csv.writer(f, lineterminator="\n")
    for r in csvlist:
        writer.writerow(r)
writerow()で1行ずつ出力しています。
lineterminator="\n"これで改行コードを指定します。
デフォルトの改行コード"\n\r"では期待した結果になりません。

Pyhton CSV読み書き

2次元配列をそのまま出力します。
from pprint import pprint
import csv
csvlist = [['列1', '列2', '列3'],
          ['11', '12', '13'],
          ['A1', 'B1', 'C1'],
          ['あ1', 'い1', 'う1']]
with open("./test/file01.csv", "w", encoding="utf-8") as f:
    writer = csv.writer(f, lineterminator="\n", quoting=csv.QUOTE_ALL)
    writer.writerows(csvlist)
writerows()で複数行を一括で出力しています。
quoting=csv.QUOTE_ALLで全てにクォートを付けています。

Pyhton CSV読み書き

csv.DictWriter

1行ずつ出力します。
from pprint import pprint
import csv
csvlist = [{'列1': '11', '列2': '12', '列3': '13'},
           {'列1': 'A1', '列2': 'B1', '列3': 'C1'},
           {'列1': 'あ1', '列2': 'い1', '列3': 'う1'}]
with open("./test/file01.csv", "w", encoding="utf-8") as f:
    fieldnames = ['列1', '列2', '列3']
    writer = csv.DictWriter(f, fieldnames=fieldnames, lineterminator="\n")
    writer.writeheader() #列名を付ける指定
    for r in csvlist:
        writer.writerow(r)
writerow()で1行ずつ出力しています。

辞書の配列をのまま出力します。
from pprint import pprint
import csv
csvlist = [{'列1': '11', '列2': '12', '列3': '13'},
           {'列1': 'A1', '列2': 'B1', '列3': 'C1'},
           {'列1': 'あ1', '列2': 'い1', '列3': 'う1'}]
with open("./test/file01.csv", "w", encoding="utf-8") as f:
    fieldnames = ['列1', '列2', '列3']
    writer = csv.DictWriter(f, fieldnames=fieldnames, lineterminator="\n")
    writer.writeheader() #列名を付ける指定
    writer.writerows(csvlist)
writerows()で複数行を一括で出力しています。


フォルダ内の複数CSVを1つのCSVにまとめる

「test」フォルダ内に複数の同一フォーマットのCSVがあります。
1行目は列名になっています。

Pyhton CSV読み書き
UTF-8(BOMなし)です。

これらのCSVを1つにします。
列名は1行目だけに出力します。
文字コードは"shift-jis"で出力します。

以下、段階的に作成していきます。

全てのCSVを2次元配列に入れる

from pprint import pprint
from pathlib import Path
import csv
p = Path("./test") files = list(p.glob("*.csv"))
row = [] for file in files: with open(file, "r", encoding="utf-8") as f: reader = csv.reader(f) for r in reader: row.append(r)
pprint(row)
Pyhton CSV読み書き

列名がファイルごとに読み込まれています。

1行目の列名を読み飛ばす

from pprint import pprint
from pathlib import Path
import csv
p = Path("./test") files = list(p.glob("*.csv"))
row = [] for file in files: with open(file, "r", encoding="utf-8") as f: reader = csv.reader(f) if len(row) == 0: #最初のcsvの1行目を見出しで使用 field_list = next(reader) else: #最初のcsv以外は単純スキップ next(reader) for r in reader: row.append(r)
print(field_list) pprint(row)
Pyhton CSV読み書き

列名を別にして取り出せています。

next()関数
iteratorの__next__() メソッドを呼び出すことにより次の要素を取得する組み込み関数です。

1つにまとめたCSVを出力する

from pathlib import Path
import csv
p = Path("./test") files = list(p.glob("*.csv"))
row = [] for file in files: with open(file, "r", encoding="utf-8") as f: reader = csv.reader(f) if len(row) == 0: #最初のcsvの1行目を見出しで使用 field_list = next(reader) else: #最初のcsv以外は単純スキップ next(reader) for r in reader: row.append(r)
#上の階層にfile99.csvとして出力
with open("./file99.csv", "w", encoding="shift-jis") as f: writer = csv.writer(f, lineterminator="\n") writer.writerow(field_list) writer.writerows(row)
Pyhton CSV読み書き

以下は、DictReaderおよびDictWriterを使った場合のスクリプトです。
from pathlib import Path
import csv
p = Path("./test") files = list(p.glob("*.csv"))
row = [] for file in files: with open(file, "r", encoding="utf-8") as f: reader = csv.DictReader(f) if len(row) == 0: #最初のcsvの1行目を見出しで使用 field_list = next(reader) else: #最初のcsv以外は単純スキップ next(reader) for r in reader: row.append(r)
#上の階層にfile99.csvとして出力 with open("./file99.csv", "w", encoding="shift-jis") as f: writer = csv.DictWriter(f, fieldnames=field_list, lineterminator="\n") writer.writeheader() #列名を付ける指定 writer.writerows(row)




同じテーマ「Python入門」の記事

第16回.Pythonの引数は参照渡しだが・・・
第17回.リスト内包表記
第18回.例外処理(try文)とexception一覧
第19回.import文(パッケージ・モジュールのインポート)
第20回.フォルダとファイルの一覧を取得(os,glob,pathlib)
第21回.CSV読み込みとopen()関数とwith文
第22回.CSV読み書き(csvモジュール)
第23回.pipコマンド(外部ライブラリのインストール)
第24回.エクセルを操作する(openpyxl)
第25回.エクセルを操作する(pywin32:win32com)
第26回.WEBスクレイピング(selenium)


新着記事NEW ・・・新着記事一覧を見る

WEBスクレイピング(selenium)|Python入門(10月11日)
エクセルを操作する(pywin32:win32com)|Python入門(10月5日)
エクセルを操作する(openpyxl)|Python入門(10月3日)
pipコマンド(外部ライブラリのインストール)|Python入門(10月1日)
CSV読み書き(csvモジュール)|Python入門(9月29日)
「Excel 4.0 マクロ」の使い方|VBA技術解説(9月28日)
CSV読み込みとopen()関数とwith文|Python入門(9月28日)
フォルダとファイルの一覧を取得(os,glob,pathlib)|Python入門(9月26日)
import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ