簡體   English   中英

垂直讀寫多個字典到csv文件

[英]Reading and writing multiple dictionaries to csv file vertically

我有多個 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文件中。

需要 output

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)

我修復了你的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'}}

使用file.write為 dict 的名稱創建新文件:

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'}}

有點hacky,但會產生您所追求的輸入:

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

您可以''.join(...)然后寫入單個 go 或添加mode='a', to_csv以便 output 直接附加到某個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM