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

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

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


Pyhton CSV読み書き

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

第21回.CSV読み込みとopen()関数とwith文
・open()関数 ・with文 ・csvの読み込み ・tsvの読み込み

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読み書き

※UTF-8(BOMあり)ならencoding="utf-8-sig"


**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 = reader.fieldnames 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の引数は参照渡しだが・・・

・参照渡しと値渡し ・これまでの復習:前提知識 ・Pythonはすべて参照渡しなのですが・・・
第17回.リスト内包表記
・リスト内包表記の基本 ・リスト内包表記の条件分岐 ・リスト内包表記の複数for文 ・リスト内包表記のネスト ・zip()関数とリスト内包表記 ・enumerate()関数とリスト内包表記 ・その他の内包表記
第18回.例外処理(try文)とexception一覧
・例外処理とは ・try文の文法 ・try文の使用例 ・組み込み例外一覧
第19回.import文(パッケージ・モジュールのインポート)
・Pythonの用語 ・import文の構文 ・標準ライブラリのインポート ・自作モジュールのインポート
第20回.フォルダとファイルの一覧を取得(os,glob,pathlib)
・出力結果のサンプルデータについて ・os.path,os.listdirの使用例 ・glob.globの使用例 ・pathlibのプロパティ・メソッド一覧 ・pathlib.Pathの使用例
第21回.CSV読み込みとopen()関数とwith文
・open()関数 ・with文 ・csvの読み込み ・tsvの読み込み
第22回.CSV読み書き(csvモジュール)
第23回.pipコマンド(外部ライブラリのインストール)
・pipとは ・pipのバージョン ・pipコマンド一覧 ・外部ライブラリ ・pipコマンド使用例 ・インストールされたライブラリの場所を確認 ・openpyxlが使えるか確認
第24回.エクセルを操作する(openpyxl)
・openpyxlのインストール ・公式リファレンス ・ブックの操作 ・シートの操作 ・セルの操作 ・表示形式・フォント・罫線・列幅・行高 ・CSVを読み込んでエクセルで出力
第24回.エクセルを操作する(pywin32:win32com)
・pywin32のインストール ・公式URL ・pywin32:win32comのエクセル操作サンプル ・エクセルのマクロを起動する ・pywin32の問題点
第26回.WEBスクレイピング(selenium)
・seleniumについて ・seleniumのインストール ・WEBサイトを表示してみましょう ・Seleniumの基本的な使い方(株価情報を取得してみる) ・色々なパターンでのseleniumの使い方 ・色々組み合わせて目的の画面にたどり着きます ・elementをコレクションで取得する ・新規ページが開かれる場合 ・上手くいかない特殊な場合の対処方法


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

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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