業務自動化の中で以下のようなケースがあり、CSVを読み込んでパースする必要があったので記録します。
- 外部サービスのCSVファイルをダウンロード
- ダウンロードしたCSVファイルを読み込み
- 必要な情報を抽出・編集
- スプレッドシートに書き込み
今回は3を実施するための2の部分についてのメモです。
やりたいこと
CSVファイルをカンマ区切りで配列に格納。
data[行][列]の形式で保持したい。
サンプルのCSV
サンプルのCSVは以下の内容にします。
a,b,c,d,e
1,2,3,4,5
21,22,23,24,25
3-1,3-2,3-3,3-4,3-5
文字列と数値を混ぜて書いてみました。
CSV読み込み方法
モジュールのインポート
CSVを簡単に読み込む場合は、csvをインポートすれば良さそうです。
csvは標準モジュールなので、pip等は不要です。
import csv
1行ずつ読み込む
まずは1行ずつ読み込みます。
import os
import csv
with open(str(os.path.dirname(__file__)) + '/sample.csv') as f:
reader = csv.reader(f)
for row in reader:
print(row)
実行結果は以下のとおり。
['a','b','c','d','e']
['1','2','3','4','5']
['21','22','23','24','25']
['3-1','3-2','3-3','3-4','3-5']
見てわかると思いますが、全てテキストデータとなります。
数値等に変換したい場合はint(value)等々でうまく変換してください。
ちなみに、os.path.dirname(__file__)
は現在実行しているPythonファイルが格納されているパスを返すものです。
今回テスト実行した際はsample.pyとsample.csvが同じフォルダにあったのでこのようになっています。
全ての行が含まれている2次元配列として読み込む
2次元配列にしたい場合は、以下のように書きます
import os
import csv
with open(str(os.path.dirname(__file__)) + '/sample.csv') as f:
reader = csv.reader(f)
list_csv_data = [row for row in reader]
print(list_csv_data)
実行結果は以下になります。
[['a','b','c','d','e'],['1','2','3','4','5'],['21','22','23','24','25'],['3-1','3-2','3-3','3-4','3-5']]
このとおり、2次元配列として取得できました。
解説するほどでもないですが、値を取る際はlist_csv_data[行][列]
のように書けば取得できます。
たとえばlist_csv_data[1][0]
であれば、’1’が返ってきます。
まとめ
まとめという程でもありませんが、以下がポイントかと思います。
- 標準モジュールのcsvを使う
- 取得したデータは全て文字列扱いになる
取得したデータが全て文字列になるのが嫌だったり、先頭行をラベルとして取得して便利につかったりしたい場合は、外部モジュールのpandasとかを使うのが良いかと思います。
その辺については使った際に書いていきますね。