代码之家  ›  专栏  ›  技术社区  ›  metersk

将嵌套字典列表写入python中的excel文件

  •  2
  • metersk  · 技术社区  · 9 年前

    我有一个嵌套字典列表,如下所示:

    [{'posts': {'item_1': 1,
                                'item_2': 8,
                                'item_3': 105,
                                'item_4': 324,
                                'item_5': 313, }},
                     {'edits': {'item_1': 1,
                                'item_2': 8,
                                'item_3': 61,
                                'item_4': 178,
                                'item_5': 163}},
                     {'views': {'item_1': 2345,
                                'item_2': 330649,
                                'item_3': 12920402,
                                'item_4': 46199102,
                                'item_5': 43094955}}]
    

    我想将其写入excel文件,格式如下:

    +--------+-------+-------+-----------+
    |        | posts | edits |   views   |
    +--------+-------+-------+-----------+
    | item_1 |     1 |     1 |      2345 |
    | item_2 |     8 |     8 |    330649 |
    | item_3 |   105 |    61 |  12920402 |
    | item_4 |   324 |   178 |  46199102 |
    | item_5 |   313 |   163 | 430949955 |
    +--------+-------+-------+-----------+
    

    我正在使用 xlsxwriter 库,并尝试了以下内容和对以下内容的变体,但没有成功:

    for item in data:
        for col_name, data in item.iteritems():
            col += 1
            worksheet.write(row, col, col_name)
            for row_name, row_data in data.iteritems():
                col += 1
                worksheet.write(row, col, row_name)
                worksheet.write(row + 1, col, row_data)
    

    我想知道修改嵌套的字典对象是否有意义,或者是否可以以当前的形式写入excel?

    当我说没有多大成功时,我的意思是,我可以让它将某些信息写入excel文件,如列名、行或数据,但我无法让它像上面所示那样写入。我没有收到错误,我怀疑我不知道如何正确地解包这个对象以循环它。在上面的代码中,我得到了第1行的行和列名称以及第2行的所有值的组合。

    我对上述代码的输出是:

    +--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
    |  | posts | item_4 | item_5 | item_2 | item_3 | item_1 | edits | item_4 | item_5 | item_2 | item_3 | item_1 | views |  item_4  |  item_5  | item_2 |  item_3  | item_1 |
    +--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
    |  |       |    324 |    313 |      8 |    105 |      1 |       |    178 |    163 |      8 |     61 |      1 |       | 46199102 | 43094955 | 330649 | 12920402 |   2345 |
    +--+-------+--------+--------+--------+--------+--------+-------+--------+--------+--------+--------+--------+-------+----------+----------+--------+----------+--------+
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Martin Evans    9 年前

    作为替代方案,可以使用 csv 如下所示:

    import csv
    import itertools
    
    nested = [
        {'posts': {'item_1': 1, 'item_2': 8, 'item_3': 105, 'item_4': 324, 'item_5': 313,}},
        {'edits': {'item_1': 1, 'item_2': 8, 'item_3': 61, 'item_4': 178, 'item_5': 163}},
        {'views': {'item_1': 2345, 'item_2': 330649, 'item_3': 12920402, 'item_4': 46199102, 'item_5': 43094955}}]
    
    headings = [d.keys()[0] for d in nested]
    entries = [sorted(nested[index][col].items()) for index, col in enumerate(headings)]    
    
    with open('output.csv', 'wb') as f_output:
        csv_output = csv.writer(f_output)
        csv_output.writerow(['items'] + headings)
    
        for cols in itertools.izip_longest(*entries, fillvalue=['<n/a>']*len(entries[0])):
            csv_output.writerow([cols[0][0]] + [col[1] for col in cols])
    

    这会给你 output.csv 如下所示:

    items,posts,edits,views
    item_1,1,1,2345
    item_2,8,8,330649
    item_3,105,61,12920402
    item_4,324,178,46199102
    item_5,313,163,43094955
    
        2
  •  2
  •   David Zemens    9 年前

    现在你有一个格言 posts , edits views 每一个都与你的“物品”相关联,这似乎是多余的。

    或者,创建一个与“条目”键控的字典 价值 每个项目的字典 帖子 , 编辑 , 意见 ,如:

    items = {}
    items = {{'item_1': {'posts':1, 'edits':0, 'views':2345}
             {'item_2': {'posts':2, 'edits':8, 'views':330649}}
    

    这样您可以简单地参考 items['item_2']['edits'] (应该会产生 8. )或 items['item_1']['views'] (应该会产生 2345 )等。

    在您的情况下,则类似于:

    # write the headers -- this could be refined
    row = 0
    worksheet.write(0, 1, 'posts')
    worksheet.write(0, 2, 'edits')
    worksheet.write(0, 3, 'views')
    
    # write the data:
    for itm in items:
        row += 1
        worksheet.write(row, 0, itm)
        for col, prop in enmumerate(items[itm]):
            worksheet.write(row, col+1, prop)
    
        3
  •  1
  •   Chankey Pathak    7 年前
    import pandas as pd
    
    data = [{'posts': {'item_1': 1,
                       'item_2': 8,
                       'item_3': 105,
                       'item_4': 324,
                       'item_5': 313, }
             },
            {'edits': {'item_1': 1,
                       'item_2': 8,
                       'item_3': 61,
                       'item_4': 178,
                       'item_5': 163}
             },
            {'views': {'item_1': 2345,
                       'item_2': 330649,
                       'item_3': 12920402,
                       'item_4': 46199102,
                       'item_5': 43094955}
             }]
    
    final_df = pd.DataFrame()
    
    for id in range(0,len(data)):
        df = pd.DataFrame.from_dict(data[id])
        final_df = pd.concat([final_df, df], axis=1)
    
    print (final_df)
    
    final_df.to_excel('data.xlsx')