【问题标题】:Reading and writing multiple dictionaries to csv file vertically垂直读取和写入多个字典到csv文件
【发布时间】:2022-01-08 17:53:26
【问题描述】:

我有多个 json 格式 'some.json' 的字典,看起来像这些

{
  "my_dict" : {
    'key1': 'value1', 
    'key2': 'value2', 
    'key3': 'value3'
  },
  "my_dict2" : {
    'key8': 'value8', 
    'key9': 'value9', 
    'key10': 'value10'
  }
}

键和值都是字符串。我想将其垂直导出为csv 格式,然后将其读回json 文件。例如,当我以 csv 格式将项目添加到 my_dict 时,它也会添加到 json 文件中。

需要的输出

my_dict
key1,value1
key2,value2
key3,value3
my_dict2
key8,value8
key9,value9
key10,value10

到目前为止我得到了一个解决方案,但问题是,字典的名称没有写在 csv 文件上,所以无法读回 json 文件

import pandas as pd

with open('some.json') as f_input:
    df = pd.read_json(f_input)

df = df.bfill(axis='columns')
df.iloc[:, 0].to_csv('some.csv', encoding='utf-8', header=False)

【问题讨论】:

  • 是否要将两个dict写入一个文件,并以dict的名字作为每个dict的分隔符?
  • @Corralien 是的!它实际上超过 2 个字典,但我可以循环它。问题是把它读回来并写​​在所需的字典上。
  • 是否可以使用像dod = {'my_dict': my_dict, 'my_dict2': my_dict2}或类似结构的dict的dict?
  • 请使用您的“some.json”文件的功能示例更新您的帖子。
  • 字典不是“json 格式”,这没有意义。 JSON 是一种基于文本的序列化格式

标签: python json pandas csv dictionary


【解决方案1】:

使用file.write 为字典名称创建新文件:

import json

with open('some.json') as f:    
    d = json.load(f)  

#sample
d = { "my_dict" : { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, 
      "my_dict2" : { 'key8': 'value8', 'key9': 'value9', 'key10': 'value10'}}
     
with open("some1.csv", 'w') as f:
     for k, v in d.items():
         f.write(k + '\n')
         for k1, v1 in v.items():
             f.write(f"{k1},{v1}\n")

my_dict
key1,value1
key2,value2
key3,value3
my_dict2
key8,value8
key9,value9
key10,value10

回读:

df = pd.read_csv("some1.csv", names=['a','b']) 

m = df['b'].isna()
df['new'] = df['a'].where(m).ffill()
s = df[~m].set_index(['new','a'])['b']

d = {level: s.xs(level).to_dict() for level in s.index.levels[0]}
print (d)
{'my_dict': {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
 'my_dict2': {'key8': 'value8', 'key9': 'value9', 'key10': 'value10'}}

编辑:

如果格式应该改变:

d = { "my_dict" : { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, 
      "my_dict2" : { 'key8': 'value8', 'key9': 'value9', 'key10': 'value10'}}

with open("some1.csv", 'w') as f:
     for k, v in d.items():
         for k1, v1 in v.items():
             f.write(f"{k},{k1},{v1}\n")
             
my_dict,key1,value1
my_dict,key2,value2
my_dict,key3,value3
my_dict2,key8,value8
my_dict2,key9,value9
my_dict2,key10,value10

s = pd.read_csv("some1.csv", names=['b'], squeeze=True)
print (s)
my_dict   key1      value1
          key2      value2
          key3      value3
my_dict2  key8      value8
          key9      value9
          key10    value10
Name: b, dtype: object


d = {level: s.xs(level).to_dict() for level in s.index.levels[0]}
print (d)
{'my_dict': {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
 'my_dict2': {'key8': 'value8', 'key9': 'value9', 'key10': 'value10'}}

【讨论】:

    【解决方案2】:

    有点老套,但会产生你想要的输入:

    [f'{col}\n{df[col].dropna().to_csv(header=False)}' for col in df.columns)]
    

    您可以''.join(...) 然后一次性写入,或者将mode='a', 添加到to_csv 以便将输出直接附加到某个文件。

    【讨论】:

      【解决方案3】:

      我修复了你的some.json 文件:

      {
        "my_dict": {
          "key1": "value1", 
          "key2": "value2", 
          "key3": "value3"
        },
        "my_dict2": {
          "key8": "value8", 
          "key9": "value9", 
          "key10": "value10"
        }
      }
      

      现在您可以将 json 文件转换为 csv 文件:

      pd.read_json('some.json', orient='index').stack().to_csv('some.csv', header=False)
      

      您的some.csv 文件如下所示:

      my_dict,key1,value1
      my_dict,key2,value2
      my_dict,key3,value3
      my_dict2,key8,value8
      my_dict2,key9,value9
      my_dict2,key10,value10
      

      注意:使用上述格式,您可以在需要时轻松在 Excel 中使用 csv 文件。

      回滚操作:

      d = pd.read_csv('some.csv', header=None, index_col=0).groupby(0, sort=False) \
            .apply(lambda x: {k: v for k, v in zip(x[1], x[2])}).to_dict()
      print(d)
      
      # Output:
      {'my_dict': {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
       'my_dict2': {'key8': 'value8', 'key9': 'value9', 'key10': 'value10'}}
      

      【讨论】:

      • 它工作得很好,直到我读回来时出错ValueError: Cannot remove 1 levels from an index with 1 levels: at least one level must be left.
      • 它可以工作,但输出按字母顺序排序。因此,例如 my_dict 是斑马,my_dict2 在我的 json 文件中是苹果。输出将是{'apple':...}, {'zebra':...}
      • 我更新了我的答案。如果您想保持原始 json 文件的顺序,请将 sort=False 设置为 groupby 的参数,否则将其删除。
      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 2018-03-19
      • 2015-05-23
      • 2014-04-12
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多