ゆるオタクの生活改善メモ帳

仕事メモとライフハック。あらゆるものを効率化してダラダラする時間を増やしたい。

pythonのsubprocess.call()でCSVを結合する方法

csvファイルを大量に作ったので分析のためにデータタイプ毎にcsv結合したくなりました。
python csv 結合」でぐぐると検索上位にpandasを利用した記事が見つかったけど、 単純にくっつけるだけならmacのコマンドならcat、widowsのコマンドならtypeでいけるのでpythonからコマンドを実行してcsvを結合してみた。

ちゃんとqiitaとかに乗せるなら実行速度を測った方がいいけど、pandas以外の方法でのメモとして残しておきます。

subprocess.call()でcatコマンドを実行

qiita.com

上記の参考記事より、catコマンドの書き方はこれでいいらしい。

cat *.csv > INPUT.csv

qiita.com

続いて、上記の参考記事によりsubprocessでコマンドが実行できるらしい。 戻り値の利用やエラーが出たときの処理は作らないのでcallを利用する。 ファイル名にはNMEAフォーマットのデータタイプが末尾に入っているのでデータタイプごとにcatする。

import subprocess
import os

# CONST
dirname = os.path.dirname(__file__)
OUTPUT_DIR = dirname + "/../../data/interim/gps" # 自分のパスに書き換える
CAT_DIR = dirname + "/../../data/processed/gps" # 自分のパスに書き換える
GPS_NMEAS = ["$GPRMC", "$GPGGA", "$GPGSA", "$GPGSV", "$GPVTG", 
             "$GPGLL", "$GPRMB", "$GPRMC", "$GPRTE", "$GPVTG",
             "$GPWPL", "$GPZDA"]

# ファイルをまとめる
# cat OUTPUT_DIR/*NMEA.csv > CAT_DIR/NMEA.csv
# nmea[1:]で"$"を読み飛ばし
# shell=Trueでシェル経由で実行
[subprocess.call("cat " + OUTPUT_DIR + "/*" + nmea[1:] + ".csv > " + CAT_DIR + "/" + nmea[1:] + ".csv",shell=True) for nmea in GPS_NMEAS]

できた!

shell=Trueでシェル経由じゃないとそんなファイル存在しないんだがと言われた。 原因不明だが、ワイルドカードが使えないのかも。深掘り調査はしない。

感想

  • でかいデータ、多くのファイル数で実行してちゃんと実行速度測ってみたい。
  • グーグルの検索順位1位が最適解かは別。検索ワードの重要性。