Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

csvライブラリ

csvモジュールの使い方について。
 
以下の内容のtest.csvを準備しました。

1,20
2,30
3,40
4,50

 
csvファイルの読み取り
(1)各行はリストとして読み込まれる。

import csv

with open("test.csv", "r") as f:
    data = csv.reader(f)
    print(data)  <_csv.reader object at 0x...>
    for i in data:  # 各行がリストになっている
        print(i)
# ['1', '20']
# ['2', '30']
# ['3', '40']
# ['4', '50']

 
(2)joinで見やすく。

with open("test.csv", "r") as f:
    data = csv.reader(f)
    print(data)
    for i in data:
        print(", ".join(i))
# 1, 20
# 2, 30
# 3, 40
# 4, 50

csv.reader()の引数になるのは、ファイルオブジェクトまたはリスト
 
(3)読み飛ばしたい行があるときはnext()する。

with open("test.csv", "r") as f:
    data = csv.reader(f)
    next(data)                    # 1行読み飛ばす
    for i in data:
        print(", ".join(i))       # 2, 30
                                  # 3, 40
                                  # 4, 50  

 
(4)読み飛ばす行をヘッダーなどとして使用するときは代入をしておく。

with open("test.csv", "r") as f:
    data = csv.reader(f)
    header = next(data)        # 1行読み飛ばし、headerに代入
    print(header)              # ['1', '20']
    for i in data:
        print(", ".join(i))    # 2, 30
                               # 3, 40
                               # 4, 50  

 
csvファイルの書き込み
newline=""とオプションを入れないと、空白行が追加されてしまう。
(1)

import csv
with open('test.csv', 'w', newline="") as f:
    writer = csv.writer(f)
    writer.writerow([1] + [20])
    writer.writerow([2, 30])
    for i in range(3, 5):
        writer.writerow([i, (i + 1) * 10])

 
(2)

data =[[1, 20], 
       [2, 30], 
       [3, 40],
       [4, 50]]
with open('test.csv', 'w', newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)

 
参考:
14.1. csv — CSV ファイルの読み書き — Python 3.6.1 ドキュメント