【问题标题】:Python only writes the key of a dictionary to a csv file [closed]Python仅将字典的键写入csv文件[关闭]
【发布时间】:2020-01-25 22:33:45
【问题描述】:

代码从输入中获取名称和密码的输入,然后将用户名和密码转换为字典

dicReg = {username: pw}

当我现在打印 dicReg 时,我得到了一个普通的字典。

{'foo': 'bar'}

现在我想将字典添加到 csv 文件中,代码运行时没有任何错误

with open('data.csv', 'a') as fp:
    writer = csv.DictWriter(fp, dicReg)
    writer.writerow(dicReg)

但是当我稍后打开 csv 文件时,它只显示字典的键

输出示例:

{'foo': 'bar'}
{'spam': 'eggs'}

https://prnt.sc/pawolz

【问题讨论】:

  • 这里有很多使用DictWriterprogramcreek.com/python/example/3190/csv.DictWriter)的例子。看起来您需要遍历 dict
  • 您的代码将值写入此处。
  • I want to add the whole dictionary。因此,您希望每个键、值对都按顺序打印到 .csv 文件中的单个单元格中?
  • 可以,如截图prnt.sc/pawolz
  • 问题已编辑

标签: python csv dictionary


【解决方案1】:

您只能使用.writerow() 获取字典值。要将键作为标题行,请使用 .writeheader():

import csv
dicReg = {'foo':'bar','foo2':'bar2'}
with open('data.csv','w',newline='') as fp:
    writer = csv.DictWriter(fp,dicReg)
    writer.writeheader()
    writer.writerow(dicReg)

输出:

foo,foo2
bar,bar2

如果您希望将键和值作为列,则不需要 DictWriter:

import csv
dicReg = {'foo':'bar','foo2':'bar2'}
with open('data.csv','w',newline='') as fp:
    writer = csv.writer(fp)
    for k,v in dicReg.items():
        writer.writerow([k,v])

输出:

foo,bar
foo2,bar2

【讨论】:

【解决方案2】:

csv.DictWriter() 的想法不是将字典转储到csv 文件,而是将多个字典写入同一个表格结构。 鉴于此,字典的keys 充当表格数据的标题。

这从official docs 的示例中可以清楚地看出:

import csv

with open('names.csv', 'w', newline='') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

输出在names.csv:

first_name,last_name
Baked,Beans
Lovely,Spam
Wonderful,Spam

编辑

如果您有一个输入 dict 想要转储到一个文本文件,这样每个 dict 条目都有 <key>,<value>,那么将其与 csv.DictWriter 一起使用的一种方法是:

import csv

data = {'foo': 'bar', 'ping': 'pong'}

with open('data.csv', 'a') as file_obj:
    writer = csv.DictWriter(file_obj, fieldnames=['key', 'val'])
    for k, v in data.items():
        writer.writerow({'key': k, 'val': v})

data.csv 的内容为:

foo,bar
ping,pong

编辑 2

如果您想要的只是一行中dict 的字符串表示,我认为csv.DictWriter() 甚至csv 都不适合这项工作。 以下代码将重现您的预期输出:

data = [
   {'foo': 'bar'},
   {'spam': 'eggs'}
]

with open('data.csv', 'a') as file_obj:
    for d in data:
        file_obj.write(str(d) + '\n')

data.csv 的内容为:

{'foo': 'bar'}
{'spam': 'eggs'}

【讨论】:

  • 我希望输出是整个字典,而不是分隔 prnt.sc/pawolz
  • @DavidD。在我看来,我回答了书面的问题。如果您还有其他问题,正如您的评论似乎表明的那样,那么也许您应该相应地改写您的问题,包括预期的输出(可能还有更多示例)。
  • 它有效,但仍然不是我需要的,我用一个例子更新了问题
  • @DavidD。见EDIT 2
【解决方案3】:

所以我的理解是你想要整本字典。如果您希望将整个字典表示为 csv 文件中的字符串,可以通过以下方式实现:

dicReg = {'foo': 'bar'}

with open('data.csv', 'a') as fp:
    writer = csv.writer(fp)
    writer.writerow([str(dicReg)])

因此您的文件将包含以下内容:

{'foo':'bar'}

虽然我建议您以 JSON 格式存储类似的内容,但也可以在 csv 中实现。

【讨论】:

  • 是的!这正是我想要的!谢谢,其他答案也可以,但我想这样,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多