寻找一种有效的方法来操纵JSON数据

时间:2015-05-26 01:04:35

标签: python json data-structures

我一直在解析一些JSON文件,并最终得到一个字典,字符串作为键,元组列表作为值。

dict具有以下格式:

str1: [(int1, bool), (int2, bool), ... ],
str2: [(int1, bool), (int2, bool), (int3, bool), ... ],
...
strN ...

我想要实现的是一个看起来像这样的表:

      int1   int2  int3
str1  bool   bool
str2  bool   bool  bool

如果没有在嵌套的fors和ifs上编写一个很长的算法,有没有办法做到这一点?不要求为我写这个,而只是暗示正确的方向。

我只想知道如何将数据操作为类似的格式。如果它兼容将其写入CSV或理想情况下的Excel文件,那就太好了。

4 个答案:

答案 0 :(得分:3)

如果您已将JSON解析为data,看起来像

data = {
    'str1': [('int1', 'bool'), ('int2', 'bool')],
    'str2': [('int1', 'bool'), ('int2', 'bool'), ('int3', 'bool')] }

然后您可以使用

将其加载到Pandas DataFrame中
import pandas as pd 
df = pd.DataFrame({key:pd.Series(dict(seq)) for key, seq in data.items()}).T

这样

print(df)

产量

      int1  int2  int3
str1  bool  bool   NaN
str2  bool  bool  bool

df.to_csv('/tmp/out.csv')

生成包含内容的CSV

,int1,int2,int3
str1,bool,bool,
str2,bool,bool,bool

答案 1 :(得分:0)

嗯,你正在解析行和行,如果你需要遍历它们 - 例如,为了检查或处理目的 - 任何算法都会在lines*rows个项目中运行。

现在,如果你不是太担心性能而是担心可读性,你可以将解析分成一些具有明确名称的函数,这些函数可以完成一小部分操作。即使某些函数是提取的for循环,它也会提高可读性。

答案 2 :(得分:0)

看起来非常直接,所以;

  • 导入用于JSON解析的库
  • 导入用于CSV写入的库

然后,将JSON解析为数据结构(可能是maplist并带有array),并通过解析该数据结构将其写入CSV。

如果数据结构不符合生成所需格式,请使用简单的for loop来修改和转换数据结构。

解决效率问题;

  • 与编写第一个解析器或编写器相比,使用库通常可以提高效率。
  • 将任何数据操作包含在夹在解析和写入阶段之间的小循环中,这样可以使您的核心算法易于识别,可读,因此希望能够提高效率。

答案 3 :(得分:0)

假设您所拥有的内容已经被解析为元组列表的元组,那么您要问的是如何将它们分组到表中。

存储具有稀疏轴的2D表的一种显而易见的方法是使用dict,键入intstr值。例如:

d = defaultdict(dict)
seen_ints = set()
for s, pairs in rows:
    for i, b in pairs:
        d[s][i] = b
        seen_ints.add(i)

现在,要获取行,只需迭代d[s].items()即可。或者,如果您希望它们按字符串的排序顺序,则迭代sorted(d[s].items())。每一行都是一个词典;要按所需顺序获取列,只需访问row[key] for key in seen_ints即可。 (如果您希望列也排序,只需在外循环之前执行seen_ints = sorted(seen_ints)。)

或者,您可以使用csv.DictWriter删除seen_ints集,然后将每行dict写为CSV行。