【问题标题】:Python csv + default dict with multi dimensionPython csv +具有多维的默认dict
【发布时间】:2017-01-03 12:18:47
【问题描述】:

我有一个 python 默认字典,如下面的结果所示。我需要将它们打印在 csv 文件中,如所需的输出所示。

print(result_fruit)
defaultdict(<class 'collections.Counter'>,
            {   'word': Counter({   'Tom_success': 5,
                                     'Jerry_Success': 4}),
                'pdf': Counter({   'Tom_success': 1,
                                   'Jerry_success': 3}),
                })

所需的 csv 输出:

mime    Tom_success Jerry_success
word      5            4
pdf       1            3

我在 csv 中的输出被破坏并且光标没有转到下一列:

mime                    Tom_success     Jerry_success
word                  
5
4  
pdf 
1
3

我的代码:

with open('output.csv', 'w') as f:
    writer = csv.writer(f,delimiter =',')
    writer.writerow( ('mime','Tom_success','Jerry_success') )
    for mime in result_fruit:
        f.write('{}\n'.format(mime))
        for category_success in sorted(result_fruit[mime]):
                writer.writerow('{}'.format(result_fruit[mime][category_success]))

【问题讨论】:

  • f.write('{}\n'.format(mime)) ??您写入文件本身和csv.writer?我不认为它会解决所有问题,但它似乎是错误的。

标签: python python-2.7 python-3.x csv numpy


【解决方案1】:

对于每一行输出,只调用一次.writerow()。传递 .writerow() 该行中项目的列表或元组。

试试这个:

with open('output.csv', 'w') as f:
    writer = csv.writer(f, delimiter=',')
    writer.writerow(('mime', 'Tom_success', 'Jerry_success'))
    for mime, data in result_fruit.items():
        writer.writerow([mime, data['Tom_success'], data['Jerry_success']])

或者,您可以使用csv.Dictwriter。同样,为每一行输出调用一次.writerow()

with open('output.csv', 'w') as f:
    writer = csv.DictWriter(f, ['mime', 'Tom_success', 'Jerry_success'])
    writer.writeheader()
    for mime, data in result_fruit.items():
        row = {'mime': mime}
        row.update(data)
        writer.writerow(row)

【讨论】:

    【解决方案2】:

    你告诉它把键和元素写在不同的行

    for mime in result_fruit:
        f.write('{}\n'.format(mime))
    
        # writes the key, and \n
    
        for category_success in sorted(result_fruit[mime]):
                writer.writerow('{}'.format(result_fruit[mime][category_success]))
    
           # does a writerow for each element of the list.
    

    等价的动作,带有普通字典和打印

    In [200]: dd = {'word': [5,4], 'pdf':[1,3]}
    In [201]: for key in dd:
         ...:     print(key)
         ...:     for v in dd[key]:
         ...:         print(v)
         ...:         
    word
    5
    4
    pdf
    1
    3
    

    你想要一个更像这样的文件写入:

    In [205]: for key in dd:
         ...:     print(key, end='\t')
         ...:     for v in dd[key]:
         ...:         print(v, end='\t')
         ...:     print()
         ...:     
    word    5   4   
    pdf     1   3
    

    您甚至可以坚持使用print 函数并添加file 参数。

    我没有使用足够的csv 模块来建议直接的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 2015-04-17
      • 2022-01-02
      • 1970-01-01
      相关资源
      最近更新 更多