2017-01-13 137 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)