Pythonの基本 CSVファイルを読み込む

f:id:wataru_boss:20180527173017p:plain
こんにちは。BOSSです。

本記事ではPythonを用いてCSVファイルをどう扱っていくのかということをまとめておこうかと思います。

モジュールは使わず、for文とリストで値を取得し出力することを目指していきます。

ファイルを開く

1行ずつ読み込む

ファイルを開くやり方は色々ありますが、ここではwith openを使います。

また、データを扱うときは各行の値を操作することが多いです。

CSVファイルを1行ずつ読み込むには次のようにプログラムを記述します。

with open('ファイルのパス', encoding='utf-8') as f:
    # ループ処理 一行ずつ表示する
    for row in f:

with openでファイルパスとエンコードを選びます。とりあえずエンコードはutf-8にしておきましょう。

ためしにCSVファイルを作成し読み込むプログラムを書いてみましょう。ファイル名はlunch.CSVとして以下の内容で作ってみてください。

唐揚げ弁当,400
とんかつ弁当,550
ハンバーグ弁当,500
のり弁当,350
コロッケ弁当,500
シャケ弁当,400
焼肉弁当,500
やきそば,400
カツカレー,850
うな重,900
ロコモコ丼,600

このお弁当と価格が1行に書かれているCSVファイルを1行ずつ読み込んでみましょう。

with open('lunch.CSVのパス', encoding='utf-8') as f:
    # ループ処理 一行ずつ表示する
    for row in f:
        print(row)

そうするとこのように表示されるかと思います。

唐揚げ弁当,400

とんかつ弁当,550

ハンバーグ弁当,500

のり弁当,350

コロッケ弁当,500

シャケ弁当,400

焼肉弁当,500

やきそば,400

カツカレー,850

うな重,900

ロコモコ丼,600


Process finished with exit code 0

これで1行ずつデータを読み込むことができました。

#各データを扱う

さて、1行のデータの中にはお弁当の名前と価格が含まれています。

これらを取り出し、データとして扱えるようにしてみましょう。

with open('/Users/boss/PycharmProjects/blog_code/lunch.csv', encoding='utf-8') as f:
    # ループ処理 一行ずつ表示する
    for row in f:
        # columnsリストに「,」ごとに区切って格納。その際改行を削除。
        columns = row.rstrip().split(',')
        menu = columns[0]
        price = columns[1]

        print(menu + 'は' + price + '円です')

結果はこうなるはずです。

唐揚げ弁当は400円です
とんかつ弁当は550円です
ハンバーグ弁当は500円です
のり弁当は350円です
コロッケ弁当は500円です
シャケ弁当は400円です
焼肉弁当は500円です
やきそばは400円です
カツカレーは850円です
うな重は900円です
ロコモコ丼は600円です

Process finished with exit code 0

先ほどとは違い、お弁当の名前と価格を別々に扱うことができました。

また、先ほどは2回改行されていました。実はprint関数は末尾に改行を付与します。

一方でファイルの行の末尾にも改行が存在しますので、そのままprint関数を用いると改行が2回改行されたままになってしまうのです。

 columns = row.rstrip().split(',')

のrow.rstrip()の部分では一番右端(末尾に相当)の空白 、 タブ 、 改行 などを削除しています。

ちなみに.lstrip()を使うと文字の前にある空白等を削除できます。

また.split(',')の部分で「,」で区切りとなっているのを分割しリストに格納しています。

どういうことかというと、

リストの名前columnsに1行ごとにデータを格納しています。columns[0]にはお弁当の名前、columns[1]には価格が入っています。(リストのインデックスは0スタートであることに注意)

このリストを操作してあげることでデータを1つずつ扱うことができているのです。

実際にデータを扱ってみる

さて、1行ずつ読み込むことができるようになったので、先ほどのCSVファイルを用いてデータを実際に扱ってみましょう。

課題
今日はハワイフェアの日です。メニュー名がロコモコ丼の場合のみ価格を2割引きにし、価格の横に[20%off!]と表示しましょう。

実行するとこんな感じになるようにしてみてください。

<<ハワイフェア>>
唐揚げ弁当:400円
とんかつ弁当:550円
ハンバーグ弁当:500円
のり弁当:350円
コロッケ弁当:500円
シャケ弁当:400円
焼肉弁当:500円
やきそば:400円
カツカレー:850円
うな重:900円
ロコモコ丼:480円[20%off!]

さて、コード例は以下のような形。

もちろん結果が出力されたら良いのでいろんな書き方ができると思います。

print('<<ハワイフェア開催!>>')

with open('/Users/boss/PycharmProjects/blog_code/lunch.csv', encoding='utf-8') as f:
    for row in f:
        columns = row.rstrip().split(',')
        name = columns[0]
        price = int(columns[1])

        # ロコモコ丼20%off
        # nameがロコモコと一致するとき
        if name == "ロコモコ丼":
            discount = int(price * (1 - 0.2))
            print(name + ':' + str(discount) + '円[20%off!]')
        else:
            print(name + ':' + str(price) + '円')

気をつけないといけないのはCSVからリストに格納されているのは文字型です。

ですので、値段の計算を行うので価格はint()を用いて整数型にしておいてください。

まとめ

今回はCSVファイルの読み込み方について例をあげながらまとめていきました。

CSVファイルの読み込みにはもっと便利にモジュールを使うこともできます。

また次の機会で扱っていけたらと思います。