🌊

[Python]標準ライブラリを使ったCSVの読み書き

2021/05/02に公開

はじめに

最近業務でPythonを使っています。Pythonを使うとなるとやはり、データ分析関連ですよね。
CSVの扱いに慣れていきたいので基本的な操作をまとめます。

読み込み

一般的な読み込み

import csv
csv_path = './test.csv'

with open(csv_path, newline='' ,encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        for column in row:
        print(column)

ちなみにrowは配列になっています。

注意点

主にWindowsで生成されるファイルには、BOM(byte order mark)という数バイトのデータが先頭に付与されたファイルになるようです。そのため以下のようにutf-8_sigとするとBOMに対応したencodingが行われるそうです。難しい!

with open(csv_path, newline='' ,encoding="utf-8") as f:

ヘッダ行をスキップする

with open(csv_path, newline='' ,encoding="utf-8") as f:
    reader = csv.reader(f)
    header = next(reader)
        for row in reader:
            print(row)

next()は操作対象の位置を次行に写しつつ、1行目の情報を配列としてheaderに代入しているようです。

配列として取得する

with open (csv_path, newline='' ,encoding="utf-8") as f:
    reader = csv.reader(f)
    arr = [row for row in reader]

こんなこともできますよと。

書き出し

このような配列をCSVとして書き出すと仮定します。

texts = [
    ['Ruby', 12],
    ['Python', 3],
    ['Java',2]
]

上書きする書き出し

with open(csv_path, 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(texts)

追記する書き出し

with open(csv_path, 'a', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(texts)

これらは’w’か’a’の違いしかありません。

辞書型の読み込みと書き出し

CSVを読み込み、辞書型に変換する

with open(csv_path, newline='' ,encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for arr in reader:
        print(dict(arr))

ヘッダ行がキーに使われる(多重配列にdict()を使った場合、先頭の配列がキーとして使われるので(ほぼ)それと同じ?)

辞書型の変数の内容をCSVに書き出す

texts = [
    {'name': 'John', 'age': 24},
    {'name': 'Mike', 'age':30}
]

fieldnames = ['name', 'age']
with open(csv_path, 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames = fieldnames)
    writer.writeheader()
    writer.writerows(texts)

fieldnamesをキーワード引数として指定することによって、何がキーとなるのかを判別している。
キーとfieldnamesがしっかり対応していないと例外が発生しました。

ReaderでヘッダなしCSVを扱う場合

例えばこんなの。

John,24
Mike, 25

属性名となりうる情報が存在しないので、fieldnamesとして定義して決めてあげます。

with open(csv_path, newline='' ,encoding="utf-8_sig") as f:
    fieldnames = ['name', 'age']
    reader = csv.DictReader(f, fieldnames = fieldnames)
    for arr in reader:
        print(dict(arr))

Discussion