私は、Pythonを使用してjsonファイルをフラットテーブルに変換して出力をcvs形式で保存できる単純なアプリケーションを作成することにしました。もっと効率的に動作させるためにコードを改善する方法をアドバイスできたらと思っていました。私は比較的小さいファイルを変換すればすべてうまくいくが、〜200MBのファイルを変換しようとするとしばらく時間がかかり始めるので、私は尋ねている。大きなファイルで作業を開始すると、データセットを変換するのにかなりの時間がかかることがあります。埋め込まれたJSONをフラットテーブルに変換する - 効率を向上
import sys, os, json, tkFileDialog, tkMessageBox
from Tkinter import *
from pandas.io.json import json_normalize
def openFile():
currdir = os.getcwd()
filename = tkFileDialog.askopenfilename(
initialdir = currdir,
title='Please select a file',
filetypes=[('JSON file','.json')])
return filename
def loading_file(path):
#File path
file_path = path
#Loading json file
json_data = open(file_path)
data = json.load(json_data)
return data
#Function that recursively extracts values out of the object into a flattened dictionary
def flatten_json(data):
flat = [] #list of flat dictionaries
def flatten(y):
out = {}
def flatten2(x, name=''):
if type(x) is dict:
for a in x:
if a == "name":
flatten2(x["value"], name + x[a] + '_')
else:
flatten2(x[a], name + a + '_')
elif type(x) is list:
for a in x:
flatten2(a, name + '_')
else:
out[name[:-1]] = x
flatten2(y)
return out
#Loop needed to flatten multiple objects
for i in range(len(data)):
flat.append(flatten(data[i]).copy())
return json_normalize(flat)
#Outputing normalized data into csv
def csv_out(data, path):
#creating csv file name
name = '~/Desktop/' + os.path.basename(os.path.splitext(path)[0]) + '.csv'
#converting to the csv
data.to_csv(name, encoding='utf-8') #'~/Desktop/out.csv'
def done():
tkMessageBox.showinfo('json2csv',"DONE!")
def main():
filepath = openFile()
data_file = loading_file(filepath)
table = flatten_json(data_file)
csv_out(table, filepath)
done()
### Application Interface ###
tk = Tk()
#Creating window:
tk.geometry('250x150+600+300')
tk.title('JSON2CSV')
#Creating convert button
convertbutton = Button(tk, text = 'Convert to .csv', command = main)
convertbutton.place(x = 25, y = 50)
tk.mainloop()
ここ
あなたは短いでしょうし、私が一緒に仕事JSON構造の単純な例:ここでは
は、私はJSONオブジェクトを平坦化について this偉大なブログ記事の助けを借りて作成された私のコードであり、[{
"_id": {
"id": "123"
},
"device": {
"browser": "Safari",
"category": "d",
"os": "Mac"
},
"exID": {
"$oid": "123"
},
"extreme": false,
"geo": {
"city": "London",
"country": "United Kingdom",
"countryCode": "UK",
"ip": "00.000.000.0"
},
"viewed": {
"$date": "2011-02-12"
},
"attributes": [{
"name": "gender",
"numeric": 0,
"value": 0
}, {
"name": "email",
"value": false
}],
"change": [{
"id": {
"$id": "1231"
},
"seen": [{
"$date": "2011-02-12"
}]
}]
}, {
"_id": {
"id": "456"
},
"device": {
"browser": "Chrome 47",
"category": "d",
"os": "Windows"
},
"exID": {
"$oid": "345"
},
"extreme": false,
"geo": {
"city": "Berlin",
"country": "Germany",
"countryCode": "DE",
"ip": "00.000.000.0"
},
"viewed": {
"$date": "2011-05-12"
},
"attributes": [{
"name": "gender",
"numeric": 1,
"value": 1
}, {
"name": "email",
"value": true
}],
"change": [{
"id": {
"$id": "1231"
},
"seen": [{
"$date": "2011-02-12"
}]
}]
}]
フラット化について言えば、ネストされた関数定義を使用することをお勧めします。私の経験では、通常はPythonでより良い方法があります。特にこの場合、外部関数のスコープ内でバインディングを使用していない場合もあります。それはあなたのプログラムをより読みやすくして、各機能が1つの明確なタスクを実行し(そしてそれをうまくやって)、ヘルパーに電話をかけさせるだけです。私の意見では、ネストされた関数定義から得られるカプセル化のほうが読みやすさの損失を上回ることはめったにありません。 [PyのZen: "フラットはネストされたものよりも良い"](https://www.python.org/dev/peps/pep-0020/) –
ありがとう、私はそれをもっと読みやすくして、ピーターズのアドバイス。 –