我正在尝试将.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 ) )
提前感谢您的帮助。
答案 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)