🌊
[Python]標準ライブラリを使ったCSVの読み書き
はじめに
最近業務で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