将大型JSON转换为CSV - Python

时间:2017-01-13 15:32:41

标签: python json csv

我正在尝试将.json文件转换为.csv,以便我可以在R中执行分析。我按照others建议的步骤,但仍然遇到问题(可能是因为大json文件的大小)。首先,我从网站上提取网址:

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 ) )

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

首先,您需要解码响应。始终使用requests库来获取http请求。它可以解码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'], ';').

答案 1 :(得分: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)