垂直读取和写入多个字典到csv文件
Posted
技术标签:
【中文标题】垂直读取和写入多个字典到csv文件【英文标题】:Reading and writing multiple dictionaries to csv file vertically 【发布时间】: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 是一种基于文本的序列化格式
【参考方案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\ndf[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
的参数,否则将其删除。以上是关于垂直读取和写入多个字典到csv文件的主要内容,如果未能解决你的问题,请参考以下文章