【问题标题】:csv.DictReader giving unexpected resultscsv.DictReader 给出意想不到的结果
【发布时间】:2018-01-27 17:30:46
【问题描述】:

我的 CSV 文件:

website, username, password
google.com, test1, lamepass
instagram.com, test2, passlame

我的python脚本:

with open(database_path) as database:
    csv_read = csv.DictReader(database)
    for card in csv_read:
        print(card['website'])

返回:

google.com
instagram.com

但是这段代码:

with open(database_path) as database:
    csv_read = csv.DictReader(database)
    for card in csv_read:
        print(card['password'])

返回:

KeyError: 'password'

我不明白这个问题,在线资源只是显示示例,没有一个解释这个问题。他们确实谈论了KeyErrors,但他们似乎没有解决 CSV 文件如何包含密钥 ('password'),但仍然返回密钥错误。

我做错了吗?

【问题讨论】:

  • 您还可以将关键字参数skipinitialspace=True 添加到您的csv.DictReader(database) 调用中,而不是物理删除文件中分隔符之间的空格字符。请参阅文档中的 Dialect.skipinitialspace。此外,如果您在for 循环中添加了print(card),您会立即看到字典中没有显示等于'password' 的键。

标签: python csv keyerror


【解决方案1】:

在您的 csv 文件中,逗号分隔值之间有空格。删除它们,它应该可以工作。

否则试试这个:

import csv

with open(database_path) as database:
    csv_read = csv.DictReader(database)

    for card in csv_read:
        print(card[" password"]) # notice the space!!!

【讨论】:

  • @Beejo 对于这些情况,请记住以下技巧:反转过程。例如。使用 DictWriter,输出一些示例记录,查看结果,找出差异。
【解决方案2】:

password(和username)前面多了一个空格:

csv = """website, username, password
google.com, test1, lamepass
instagram.com, test2, passlame"""

with open('file.csv', 'w+') as f:
    f.write(csv)

import csv

with open('file.csv', 'r+') as database:
    csv_read = csv.DictReader(database)
    for card in csv_read:
        print(card)


OrderedDict([('website', 'google.com'), (' username', ' test1'), (' password', ' lamepass')])
OrderedDict([('website', 'instagram.com'), (' username', ' test2'), (' password', ' passlame')])

您应该尝试使用以下方法从 csv 中删除多余的空格:

csv = csv.replace(", ", ",")

【讨论】:

  • @Beejo 当然,我也经常使用 pandas 来处理 csv 文件。也许 dictwriter 更适合简单的任务
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2021-04-22
相关资源
最近更新 更多