Python:写入具有多个标题行的 CSV

Tri*_*riz 6 python csv dictionary data-structures pandas

语境

\n\n

我希望导出一个字典,其中包含字典列表作为每个键:值对的值:

\n\n
dict = {'key_1':\n        [{'key_a': foo_1, 'key_b': bar_1}, \n         {'key_a': foo_2, 'key_b': bar_2}], \n        'key_2':\n        [{'key_c': foo_1, 'key_d': bar_1}], \n         {'key_c': foo_2, 'key_d': bar_2}] \n        ...}\n
Run Code Online (Sandbox Code Playgroud)\n\n

所需的输出将是一个 .csv 文件,其中包含第一个字典的键(key_1、key_2 等)作为第一个标题行,然后是嵌套字典的键(key_a、key_b 等)作为第二个标题行对应于其各自的键。

\n\n

所需输出的示例如下所示,其中列表索引列引用存储在字典列表中每个相应索引处的数据:

\n\n
\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa4\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91            \xe2\x95\x91     key_1     \xe2\x94\x82     key_2     \xe2\x95\x91\n\xe2\x95\x91 List Index \xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa4\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa4\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91            \xe2\x95\x91 key_a \xe2\x94\x82 key_b \xe2\x94\x82 key_c \xe2\x94\x82 key_d \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91     0      \xe2\x95\x91 foo_1 \xe2\x94\x82 bar_1 \xe2\x94\x82 foo_1 \xe2\x94\x82 bar_1 \xe2\x95\x91\n\xe2\x95\x9f\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x95\xab\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x95\xa2\n\xe2\x95\x91     1      \xe2\x95\x91 foo_2 \xe2\x94\x82 bar_2 \xe2\x94\x82 foo_2 \xe2\x94\x82 bar_2 \xe2\x95\x91\n\xe2\x95\x9f\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x95\xab\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x95\xa2\n\xe2\x95\x91     2      \xe2\x95\x91 foo_3 \xe2\x94\x82 bar_3 \xe2\x94\x82 foo_3 \xe2\x94\x82 bar_3 \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa7\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa7\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa7\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

平台:树莓派 3b+、Python 3.6

\n
\n\n
\n\n

代码

\n\n

目前,我正在研究执行此操作的不同选项,因此没有任何接近工作的连贯代码。然而,按照优先顺序,以下是我正在考虑的一些选项:

\n\n
    \n
  • 使用 pandas 形成一个反映所需表性质的数组。然后直接将其写入 CSV。

  • \n
  • 从上述字典数据结构写入 CSV。

    \n\n
    import csv\n\nfield_names = dict.keys()\nheader2 = {'%s' %dict.keys() : dict[key_1][0].keys()}\n\nwith open('project_data.csv', 'a') as csvfile:\n    writer = csv.DictWriter(csvfile, fieldnames=field_names)\n    writer.writeheader()  # Write header row containing the top field names\n    writer.writerow(header2)  #Write row containing the second field names\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    显然,该代码需要进一步开发才能使其按预期工作。

  • \n
  • 另一种我没有考虑过的方法?

    \n\n
  • \n
\n\n

问题

\n\n

以这种格式写入 CSV 的最佳方法是什么?

\n

ank*_*_91 2

到目前为止我已经到达这里:

d = {'key_1':
    [{'key_a': 'foo_1', 'key_b': 'bar_1'}, 
     {'key_a': 'foo_2', 'key_b': 'bar_2'}], 
    'key_2':
    [{'key_c': 'foo_1', 'key_d': 'bar_1'}, 
     {'key_c': 'foo_2', 'key_d': 'bar_2'}]}
df = pd.DataFrame(d)
df1 = []
for col in df.columns:
    data = df[col].apply(pd.Series)
    data = df1.append(data)
df1 = pd.concat(df1,axis=1)
print(df1)
Run Code Online (Sandbox Code Playgroud)

这给你:

  key_a   key_b    key_c     key_d
0 foo_1   bar_1    foo_1     bar_1 
1 foo_2   bar_2    foo_2     bar_2 
Run Code Online (Sandbox Code Playgroud)

剩下的,您必须将相应的键映射到您的原始列名称,并且 tat 可以df1.loc[-1]作为标识符放置。一旦我得到一些东西,我就会更新。