2015-08-19 27 views
-2

我有一個巨大的JSON文件要傳輸到CSV。我在互聯網上搜索了很多東西,我試圖自己寫Python,但沒有任何作用。我一直在這裏呆了一個星期。任何人都可以幫助我嗎? json的文件格式是:轉換巨大的JSON文件,CSV文件

{"Gid": "5999043768223797248", 
"rights": [{"grantorContext": "Freemium right added by Netlife", "sku": "CMO-STO-2-FREE", "rightId": "5340e29a6dc01000", "grantorId": "NETLIFE_B2C"}], 
"used_quota": "16.95", 
"creationtime": "2001-04-29 12:58:33", 
"devices": [{"last_connection": "2001-05-30 22:06:08", "os_version": "4.2.2", "auto_upload": "wifi", "last_upload": "2002-04-29 13:12:26", "device_name": "i-mobile i-STYLE 7.5", "platform": "unknow", "client_version": "2.0.0"}], 
"total_quota": 2.0, 
"Uid": ["666927729520"]} 


{"Gid": "5999043740151320576", 
"rights": [{"grantorContext": "Freemium right added by Netlife", "sku": "CMO-STO-2-FREE", "rightId": "5340e29f72c05000", "grantorId": "NETLIFE_B2C"}, 
      {"grantorContext": null, "sku": "CMO-STO-25-M", "rightId": "53b5d2d8b0400000", "grantorId": "DTN"}], 
"used_quota": "480.85", 
"creationtime": "2001-04-29 12:58:38", 
"devices": [{"last_connection": "2001-08-02 03:46:05", "os_version": "8.4", "auto_upload": "wifi", "last_upload": "2015-08-02 03:46:05", "device_name": "Nokia", "platform": "unknow", "client_version": "1.0.0"}], 
"total_quota": 27.0, 
"Uid": ["465949097714"]} 


{"Gid": "5999043675907166208", 
"rights": [{"grantorContext": null, "sku": "CMO-STO-25-M", "rightId": "53b5d2e161000000", "grantorId": "DTN"}, 
      {"grantorContext": "Freemium right added by Netlife", "sku": "CMO-STO-2-FREE", "rightId": "5340e29b42805000", "grantorId": "NETLIFE_B2C"}], 
"used_quota": "8.26", 
"creationtime": "2001-04-29 12:58:35", 
"devices": [{"last_connection": "2001-04-29 13:08:24", "os_version": "4.2.2", "auto_upload": "wifi", "last_upload": "2002-04-29 13:03:25", "device_name": "Nokia V797", "platform": "unknow", "client_version": "2.0.0"}], 
"total_quota": 27.0, 
"Uid": ["666994575443"]} 
+3

如果沒有任何工作,儘管你嘗試了一切,那麼我們都註定失敗,世界即將結束。但是後來我對此表示懷疑,所以請張貼一些你的嘗試,並解釋發生了什麼,以及應該做什麼。 –

+0

如果您從一個小JSON文件開始編寫程序將其轉換爲CSV,那麼這將是解決您的巨大問題的一個步驟? – barny

+0

JSON文件有多大? – Cyphase

回答

0

我自己有一個類似的文件!

這不是一個有效的JSON文件。這是一組連接成一個的JSON文件。從Python json.dumps文檔

不同於鹹菜和元帥,JSON是不是一個框架協議,所以使用 同FP試圖 連載多個對象與重複調用轉儲()會導致一個無效的JSON文件

這意味着,即使將所有適合在內存中一次,你不能使用json.load讀取這個文件,除非你編輯「[」前第一行和一個「]」在結束和c每個元素之間的ommas(即在「}」和「{」之間的空行處)你可以與python json模塊進行鬥爭,並讓它做我認爲你想要的,按順序讀取七個元素的每一個組作爲一個帶鍵「Gid」「權限」的python字典等。

您必須使用JSONDecoder類的raw_decode方法,該方法將在關閉「}」處停止並將索引返回到正在掃描的字符串中,以便你可以砍掉它剛剛處理的東西。

因此,閱讀一個舒適大塊巨大的文件,以及一個異常處理程序中嘗試raw_decode的元素。如果成功,則保存解碼結果,刪除已成功解碼的部分,然後重複。如果出現異常,請從文件中讀取另一個塊並追加到正在解碼並重復的字符串。如果您仍然遇到異常,那麼您所在的JSON元素已損壞(或者比您的塊大小更長,或者您未能正確處理文件結尾)。

它要容易得多代碼,如果你的文件小於幾十MB的(幾百?)。然後,只需將整個事件讀入一個字符串,並從其前面剔除JSON元素,直到只剩下空白或直到遇到解碼器錯誤時爲止。

0

這裏的蠻力方式,當文件小到足以把一個字符串不會耗盡內存

import json 
import re 

multijsons = open('file.json','r').read() 

sep = re.compile(r'\}\s*\{') 
jsonlist = '[' + re.sub(sep, '}, {', multijsons) + ']' 

load = json.loads(jsonlist) 

# quick debug: 
for item in load: 
    print item 
    print '\n---\n' 

這是我用過,因爲我的文件就沒有那麼巨大。思考上面的代碼,但並不需要它,它看起來好像很棘手 - 凌亂

+0

謝謝nigel222。不幸的是,到今天爲止,我的文件是350M,下週它很容易達到500M。 – liga810

+0

使用re.split是一種不太暴力的方式。我只是測試了將一個500Mb的字符串拆分爲500,000個字符串,並且在8Gb的Cire-i3 PC上花費了大約兩秒鐘的時間。 – nigel222

0

這裏是一個使用re.split() 0123.我稍微測試了一下,只需要幾秒鐘就core-i3與8GB內存

huge="{" + "a"*1000 + "}\n" 
huge = huge * 500000 
len(huge)/1000000.0 
# get 501.5 (Mbytes) 
jsons = re.split(r'\}\s*\{', huge) 
len(s) 
# get 500000, took about 2 seconds 
del huge # might be a good idea to free half a gigabyte asap. 

分割產生的個別JSON元素,每個都在它自己的字符串,減去大括號(除第一)和右大(除了最後一個)。所以其餘的工作(未經測試)將是

jsons[0] = jsons[0] + '}' 
n = len(jsons) 
jsons[n-1] = '{' + jsons[n-1] 
for i in range(1, n-1): jsons[i] = '{' + jsons[i] + '}' 

# i'd anticipate another couple of seconds to get here 

for j in jsons: 
    data = json.load(j) 
    # do whatever with data 
    # will take as long as it's going to take ....