【发布时间】:2018-04-02 07:10:03
【问题描述】:
我对 Python 还很陌生,我需要在 Python 2.7 中使用标准库only 和 特别 从在线压缩的 CSV 文件中制作嵌套 JSON。我已经弄清楚了访问和解压缩文件的方法,但是在解析时遇到了一些问题。基本上,我需要为每个主键创建一个包含三个高级元素的 JSON 输出:
- 主键(由 0、2、3 和 4 列组成)
- 一个字典,它是该 PK 观察值的时间序列(即:日期:观察值)
-
元数据字典(产品、流类型、单位,理想情况下是每个观察点质量的嵌套时间序列。
from StringIO import StringIO from urllib import urlopen from zipfile import ZipFile from datetime import datetime import itertools as it import csv import sys url = urlopen("https://www.jodidata.org/_resources/files/downloads/gas-data/jodi_gas_csv_beta.zip") myzip = ZipFile(StringIO(url.read())) with myzip.open('jodi_gas_beta.csv','r' ) as myCSV: #Read the data reader=csv.DictReader(myCSV) #Sort the data by PK + Time for timeseries reader=sorted(reader,key=lambda row: row['REF_AREA'],row['ENERGY_PRODUCT'],row['FLOW_BREAKDOWN'],row['UNIT_MEASURE'],row['TIME_PERIOD'])) #initialize dictionaries for output myData=[] keys=[] groups=[] #limiting to first 200 rows for testing ONLY for k, g in it.groupby(list(it.islice(reader,200)),key=lambda row: row['REF_AREA'],row['ENERGY_PRODUCT'],row['FLOW_BREAKDOWN'],row['UNIT_MEASURE'])): keys.append(k) groups.append(list(g)) myData.append({'MyPK': ''.join(k), #captures the PKs 'TimeSeries' : dict((zip(e['TIME_PERIOD'],e['OBS_VALUE']))) for e in g], #Not working properly, want a time series dictionary here #TODO: Dictionary of metadata here (with nested time series, if possible)}) #TODO: Output as a JSON string
所以,结果应该是这样的:
{
"myPK": "AENATGASEXPLNGM3",
"TimeSeries":[
["2015-01", 756],
["2015-02", 572],
["2015-03", 654]
],
"Metadata":{
"Country":"AE",
"Product":"NATGAS",
"Flow":"EXPLNG",
"Unit":"M3",
"Quality:[
["2015-01", 3],
["2015-02", 3],
["2015-03", 3]
]
}
}
【问题讨论】:
-
如果您的代码正在构建您想要的结构,那么几乎所有这些都与minimal reproducible example 无关。只需向我们展示一个示例,说明
myData中的内容以及您想用它做什么(您没有给我们的一件事)。另一方面,如果你的代码有问题,你必须解释这个问题是什么。 (此外,它必须实际运行到问题发生的地步——您发布的代码只会在from zipfile行上引发SyntaxError。) -
反正你好像在stdlib中找到了
csv、ZipFile等模块。还有一个叫json,它完全符合您的要求。 -
我知道 JSON 库可以帮助进行最终转储格式化,但是让数据解析为正确的时间序列子组是我遇到的困难。刚刚更新以显示输出示例。
-
好的,那你现在有什么?
myData与此有何不同?您需要实际告诉我们您的问题是什么,而不是让我们根据您代码中的TODOcmets 以及您在文本中没有说您知道该怎么做的事情来猜测。 -
在我的数据中 #1 很好 - 但我似乎无法正确表示数据点的嵌套字典时间序列(这是三个输出中的 #2) - 它只是没有一个时间序列字典,我不确定我做错了什么(如果你运行代码,你会看到)。我还没有尝试过#3,因为它建立在正确的#2之上。
标签: python json python-2.7 csv itertools