and one+

IT系の雑なメモを残していくブログです

【Python】CSV を保存する(改定)

f:id:Gyrokawai:20210415150303j:plain


半年くらい前から Python を始めて、バスケットボールのプロリーグ「B リーグ」の公開データをスクレイピングしたり加工したりしています。

その中で使ったやり方をメモとして記録します。

 

今回は「CSV を保存する(改定)」

 

参考サイト

Python に関する情報はまず以下のサイトを参照するのがベスト。基本的な使い方から応用まで幅広く助かります。 

note.nkmk.me

 

改定前の内容

すごく素直に csv を保存しているバージョン。 

これはこれで勉強になりました。

gyrokawai-memo.hatenablog.com

 

改定後の内容

pandas の df.to_csv を利用して、データが重複した際の挙動をシンプルに制御します。

追加データ内の重複排除、既存データを合わせた上での重複排除(既存を残す、追加データを残す)を実現します。

 

コード

import os
import pandas as pd
import pathlib

 

def writeFile(originalFile, writeDataFrame, subsetList, indexMode, writeMode):
    # 親フォルダが無ければ作成する
    os.makedirs(pathlib.Path(originalFile).parent, exist_ok=True)
    # 書き込みデータの重複排除
    writeDataFrame.drop_duplicates(subset=subsetList, inplace=True)
    
    if os.path.isfile(originalFile):
        df_temp = pd.read_csv(originalFile, header=0)
        df = pd.concat([df_temp, writeDataFrame])
        # 新しいほうが正(Write New)
        if writeMode == 'wn':
            df.drop_duplicates(subset=subsetList, keep='last', inplace=True)
            df.to_csv(originalFile, index=indexMode, encoding='utf8', sep=',', mode='w')
        # 古いほうが正(Write Old)
        elif writeMode == 'wo':
            df.drop_duplicates(subset=subsetList, keep='first', inplace=True)
            df.to_csv(originalFile, index=indexMode, encoding='utf8', sep=',', mode='w')
        # 新しいデータを追記(未作成)
        elif writeMode == 'a':
            pass
        else:
            pass
    else:
        writeDataFrame.to_csv(originalFile, index=indexMode, encoding='utf8', sep=',')  

 

writeFile 名の外部関数。引数は以下の通り。

 

[引数]

originalFile:更新対象となるファイル名(****.csv

writeDataFrame:追加で書き込みするデータフレーム

subsetList:重複排除する場合に重複を判定する列のリスト

indexMode:書き出す csv に index を出力するか(True)/しないか(False)

writeMode:重複排除した結果の残し方(wn | wo | a | その他)

 

書き込むために一度 DataFrame 化しないとならない手間は感じるものの、csv モジュールで同じことを実装したらそれだけで 100 行くらいいってしまったので、かなりシンプルになったので見た目としてはこちらの方がいいと思う。

 

謝辞

参考サイトの皆さま、ありがとうございました。