2017-01-13 100 views
0

我試圖將.json文件轉換爲.csv,以便我可以在R中執行分析。我按照others建議的步驟操作,但仍遇到問題(可能由於json文件的大尺寸)。首先,我從網上拉URL:將大型JSON轉換爲CSV - Python

import urllib 

#first open html as .json 
response = urllib.request.urlopen("http://trends.vera.org/data/county/1003/") 
input = response.read() 
print(input) 

這個函數下面我從鏈接問題得到平坦的json文件。

#function to flatten .json file 
def flattenjson(b, delim): 
    val = {} 
    for i in b.keys(): 
     if isinstance(b[i], dict): 
      get = flattenjson(b[i], delim) 
      for j in get.keys(): 
       val[ i + delim + j ] = get[j] 
     else: 
      val[i] = b[i] 

    return val 

下面的代碼列出了一個列表併爲csv生成列名。 這是哪裏出問題了。有誰知道如何解決這個問題?

#find column names 
input = map(lambda x: flattenjson(x), input) 
columns = map(lambda x: x.keys(), input) 
columns = reduce(lambda x,y: x+y, columns) 
columns = list(set(columns)) 
print(columns) 

最後,我將json數據寫入.csv文件。

#write to .csv file 
with open(fname, 'wb') as out_file: 
    csv_w = csv.writer(out_file) 
    csv_w.writerow(columns) 

    for i_r in input: 
     csv_w.writerow(map(lambda x: i_r.get(x, ""), columns)) 

在此先感謝您的幫助。

+1

如果您收到錯誤,請將其發佈在您的問題中。 – sisanared

回答

0

首先你需要解碼響應。對於http請求,始終使用requests庫。它可以解碼json。

import requests 
response = requests.get("http://trends.vera.org/data/county/1003/") 
data = response.json() 

您的第二部分有另一個錯誤。 flattenjson需要2個agruments,你只提供一個。其次是CSV文件中的分隔符。此代碼的工作:

print(flattenjson(data, ';')) 

如果你並不需要所有的數據,你可以指定精確關鍵字:

flattenjson(data['yearlyData'], ';'). 
+0

另一個建議:嘗試在R中使用JSON。它比CSV更便於數據表示格式。 – Raz

+0

你說得對。在R中做它變得容易得多。 – hjohns12

0

R中這樣做竟然是容易得多。該列表中只有一個項目具有表格數據,全部都是數字。但它也有一些有趣的格式,因此需要grab_column()函數。 Result包含表格格式的數據。

library(rjson)  

tmp <- rjson::fromJSON(file = "http://trends.vera.org/data/county/1003/") 

grab_column <- function(x) { 
    tmp <- as.character(x) 
    if (length(tmp) == 0) tmp <- NA 
    else tmp[tmp == "NULL"] <- NA 
    as.numeric(tmp) 
} 

Result <- as.data.frame(lapply(foo, FUN = grab_column)) 
Year <- data.frame(year = as.numeric(names(foo[[1]]))) 
Result <- cbind(Year, Result)