【问题标题】:Printing lists to a CSV将列表打印到 CSV
【发布时间】:2018-07-24 08:48:13
【问题描述】:

我有一个清单:

OrderedDict([('user', 'john'), ('password', '7f5a343ca80b8127abb97d5dc5459193'), ('firstname', 'John'), ('valid', 'VALID')])
OrderedDict([('user', 'leila'), ('password', 'c769c2bd15500dd906102d9be97fdceb'), ('firstname', 'Leila'), ('valid', 'VALID')])
OrderedDict([('user', 'chris'), ('password', '5badcaf789d3d1d09794d8f021f40f0e'), ('firstname', 'Christopher'), ('valid', 'VALID')])
OrderedDict([('user', 'phill'), ('password', '21b72c0b7adc5c7b4a50ffcb90d92dd6'), ('firstname', 'Phill'), ('valid', 'VALID')])
OrderedDict([('user', 'morton'), ('password', '5f4dcc3b5aa765d61d8327deb882cf99'), ('firstname', 'Morton'), ('valid', 'VALID')])

我想将其放入 .CSV - 基本上该文件用于存储用户,并且我有一个程序可以添加带有密码/哈希的用户。

我目前有:

with open("output2.csv", 'w') as outputFile:
        wr = csv.writer(outputFile, dialect='excel')
        n = 0
        while n < len(dict_list):
            print(dict_list[n])
            wr.writerow(dict_list[n])
            n += 1
    quit()

但 .CSV 文件仅显示以下内容:

user,password,firstname,valid
user,password,firstname,valid
user,password,firstname,valid
user,password,firstname,valid
user,password,firstname,valid

我确实需要将它作为 CSV 文件的第一行,但我需要打印每个条目,而不需要下面的标题。

【问题讨论】:

标签: python python-3.x list csv output


【解决方案1】:

您应该使用csv.DictWriter 而不是csv.writer
DictWriterwriterow 接受字典,而writer.writerow
需要一个可迭代对象,因此当您传递 dict 时,它会写入其键而不是值。

编辑:

要使用dict 的键编写标题,您应该在写入行之前添加以下行:

wr.writeheader()

此外,还有writerows 方法,它获取dicts 的整个列表 并将其写入文件。
所以,总结一下,你的代码应该是这样的:

with open("output2.csv", 'w') as outputFile:
    wr = csv.DictWriter(outputFile, fieldnames=dict_list[0].keys(), dialect='excel')
    wr.writeheader()
    wr.writerows(dict_list)

【讨论】:

  • 这会抛出错误——DictWriter 需要参数字段名,例如:wr = csv.DictWriter(outputFile, fieldnames=['user', 'valid', 'firstname', 'password'] , dialect='excel')
  • @michetonu,谢谢!我错过了fieldnames 不是可选参数。
【解决方案2】:

您应该始终使用pandas 进行数据操作。您可以从(有序)dicts 列表创建数据框,然后使用 pandas 的 to_csv 函数将整个内容转储到文件中。

import pandas as pd
odList = [ordered_dict1, ordered_dict2, ordered_dict3, ordered_dict4, ordered_dict5]

output = pd.DataFrame(odList)

这将输出:

     user                          password    firstname  valid
0    john  7f5a343ca80b8127abb97d5dc5459193         John  VALID
1   leila  c769c2bd15500dd906102d9be97fdceb        Leila  VALID
2   chris  5badcaf789d3d1d09794d8f021f40f0e  Christopher  VALID
3   phill  21b72c0b7adc5c7b4a50ffcb90d92dd6        Phill  VALID
4  morton  5f4dcc3b5aa765d61d8327deb882cf99       Morton  VALID

要将其保存到 csv 文件:

output_path = 'your_file_name.csv'
output.to_csv(output_path)

要从 csv 中排除索引(左侧的数字),请设置 index=False

output.to_csv(output_path, index=False)

【讨论】:

  • 这有什么不相干的?它正是 OP 想要做的。
  • 这无关紧要,因为您绝对绝对需要 panda 来解决问题。当问题可以很容易地解决而不通过传递字典的值而不是传递字典本身(或使用 csv.DictWriter)时,添加对巨大库的依赖以仅使用一个单一的侧面功能违背了所有良好实践。跨度>
  • 显然它完成了这项工作,并且是这项任务的绝佳选择。到目前为止,pandas 是否为 OP 引入了另一个主要依赖项是未知的,与我们无关。
  • 确切地说,csv 作为一个包非常好,但对于任何类型的动态操作或分析,pandas 非常优越和灵活。 OP 至少应该知道该选项。我真的不明白这种火热的反应。
  • @brunodesthuilliers 没有人说这是最好的答案。您是对的,您不需要 需要 pandas 来解决问题,而 那个 是无关紧要的。这绝不是提交答案的目的,否则每个问题只允许一个答案。否决这是疯狂的,这是一个非常好的解决方案。 Pandas 是一个非常流行的库,很多人已经拥有它。如果他们没有,他们可以得到它,如果没有,请查看另一个答案。 +1。不过,说“总是”使用 pandas 有点强。
【解决方案3】:

因为

dict_list[n]

是您的 OrderedDicts 之一。

然后

wr.writerow(dict_list[n])

将遍历您的有序字典。

但是,这将是一个键列表。

你可能更想要什么:

wr.writerow([dict_list[n][x] for x in dict_list[n]])

获取字典中每个键的值。

【讨论】:

  • 听说过dict.values() 吗?
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多