pythonを理解していないという事もあり、意外とはまってしまった。
調べると簡単に出てくるのだが、無駄に粘って時間をロス。
saveCSV.py
import json
import csv
import os
f = open('hoge.json', 'r', encoding='utf-8') #encoding='utf-8'がないと読み込めない
data = f.read()
#jsonファイルからとってきたデータ
#[{"code":"13101","province":"東京都","city":"千代田区"},{"code":"13102","province":"東京都","city":"中央区"}]
dict_list = json.loads(data) #jsonを辞書型リストに変換
#[{'code': '13101', 'province': '東京都', 'city': '千代田区'}, {'code': '13102', 'province': '東京都', 'city': '中央区'}]
file_name = 'hoge'
exist_file = os.path.exists(file_name + '.csv') #hoge.csvがあるかどうか確認
labels = dict_list[0] #データベースでいうカラムの部分。今回はcode,province,city
if exist_file: #もしhoge.csvが存在していたら
f = open('hoge.csv', 'a', newline="")
#modeをaにする事で既存のファイルに追記してくれる
#newline=""はCSVファイル内の行を詰めてくれる
w = csv.DictWriter(f, fieldnames=labels)
#辞書型リストを記入するのであればcsv.DictWriterを使う。ここでかなりはまった
w.writerows(dict_list) #下記のようにfor文で回すことも可能
# for elem in dict_list:
# w.writerow(elem)
f.close()
else: #hoge.csvがない場合
f = open('hoge.csv', 'a', newline="") #hoge.csvを作成
w = csv.DictWriter(f, fieldnames=labels)
w.writeheader()
#labelsで定義したカラムを先頭に追加。hoge.csvが存在しているときの処理にはない
w.writerows(dict_list)
f.close()
作成したファイルの中身は以下の通り。
hoge.csv
code,province,city
13101,�����s,���c��
13102,�����s,������
文字化けでできているかどうかわからないので、
CSVファイル内でちゃんと保存されているか確認用のファイルを作成
parseCSV.py
import csv
f = open('new.csv', 'r')
reader = csv.reader(f)
dataArr = []
for i, row in enumerate(reader):
print(row)
f.close()
ターミナル上で以下のように出力された
terminal
['code', 'province', 'city']
['13101', '東京都', '千代田区']
['13102', '東京都', '中央区']
f = open('hoge.csv', 'a', newline="")の引数にencoding='utf8'を入れてやれば文字化けせずに書き込んでくれる。
↧