かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Python データにコンマ , を含む CSV をいい感じに扱いたい

スプレッドシートで JINNER JOIN, OUTER JOIN をしたかったけど VLOOKUP 関数だと1つのセルしか取ることができなかったので、面倒くささが爆発して PythonスプレッドシートCSV でダウンロードして加工していました。
雑に file open して改行とコンマ , で配列にしていたら、JSONデータとか , を含むデータがあるとセルが壊れてしまったので、PythonCSVをいい感じに扱うのメモ。

sample.csv

id, name, data
1, 星宮 いちご, "{""type"": ""cute"", ""unit"": [""soleil"", ""STAR☆ANIS"", ""2wingS"", ""コスモス"", ""ラッキーストロベリー""]}"
2, 霧矢 あおい, "{""type"": ""cool"", ""unit"": [""soleil"", ""STAR☆ANIS""]}"
3, 紫吹 蘭, "{""type"": ""sexy"", ""unit"": [""soleil"", ""STAR☆ANIS""]}"

CSV が壊れてしまうダメな例

def readCSV(filePath):
  try:
    with open(filePath, "r", encoding="utf-8") as f:
      data = f.read().split("\n")
      return {
        "header": data[0].split(","),
        "data": [row.split(",") for row in data[1:]]
      }
  except Exception as err:
    print(err)
    return None

csvData = readCSV("sample.csv")
print(csvData)

↓ 出力結果

{
  'header': ['id', 'name', 'data'],
  'data': [
    ['1', '星宮 いちご', '"{""type"": ""cute""', ' ""unit"": [""soleil""', ' ""STAR☆ANIS""', ' ""2wingS""', ' ""コスモス""', ' ""ラッキーストロベリー""]}"'],
    ['2', '霧矢 あおい', '"{""type"": ""cool""', ' ""unit"": [""soleil""', ' ""STAR☆ANIS""]}"'],
    ['3', '紫吹 蘭', '"{""type"": ""sexy""', ' ""unit"": [""soleil""', ' ""STAR☆ANIS""]}"']
  ]
}

, を含むデータ部分で分割されてしまう
(ᐡ o̴̶̷̤ ﻌ o̴̶̷̤ ᐡ) ぴえぴえ

, を含む CSV データを扱う Good な方法

csv 標準ライブラリを使用する

csv.reader(csvfile, dialect='excel', **fmtparams)
与えられた csvfile 内の行を反復処理するような reader オブジェクトを返します。
cf. csv --- CSV ファイルの読み書き — Python 3.9.2 ドキュメント

import csv

def readCSV(filePath):
  try:
    with open(filePath, "r", encoding="utf-8") as f:
      reader = csv.reader(f)
      csvData = [row for row in reader]
      header, *data = csvData

      return {
        "header": header,
        "data": data
      }
  except Exception as err:
    print(err)
    return None

csvData = readCSV("sample.csv")
print(csvData)

↓ 出力結果

{
  'header': ['id', 'name', 'data'],
  'data': [
    ['1', '星宮 いちご', '{"type": "cute", "unit": ["soleil", "STAR☆ANIS", "2wingS", "コスモス", "ラッキーストロベリー"]}'],
    ['2', '霧矢 あおい', '{"type": "cool", "unit": ["soleil", "STAR☆ANIS"]}'],
    ['3', '紫吹 蘭', '{"type": "sexy", "unit": ["soleil", "STAR☆ANIS"]}']
  ]
}

いい感じのCSVがいい感じです!
₍ ᐢ. ̫ .ᐢ ₎ YATTANE!!!

ポエム

ふつーに考えたら split(",") なんてしたらデータ中にコンマ , 含まれてたらデータ壊れるわ。って考えがすっぽり抜け落ちてしまっていたのでお脳の劣化がやゔぁい…
3月から join した会社での稼働時間が毎日長すぎてコードかけないからドンドン忘れていっています!
若い人が多いのに MTG ばかりして、就業時間後くらいにしか作業ができない & 土日も働くのが平気みたいな文化で非常に辛い。全社MTGで新入社員紹介に付き合った人の遍歴言わせるとかパワハラ体質な感じもあって、最近の若い子は一周回って昭和的な文化なのか、営業的な考えの人が上層部にいるとそういう文化になってしまう環境起因のか、人間の性質形成の例として大変興味深くなっています。次はちゃんとしたテックカンパニーを探します…
コード書ける環境に身を置きたいので各位よろしくおねがいします!!


[参考]

いい感じのお皿がいい感じです!な まちカドまぞく 6巻読みたいけどどこに売ってるの〜?