【问题标题】:Building list of dicts from csv using Python使用 Python 从 csv 构建字典列表
【发布时间】:2019-10-03 13:27:31
【问题描述】:

我有一个包含三列和多行的 CSV 文件。所有数据都是字符串。我正在尝试一次读取 CSV 一行并将每一行转换为一个字典,然后我想将其附加到一个列表中,这样我就有了一个字典列表。环境是 AWS Lambda,CSV 来自 S3 存储桶。

我的代码:

csv_object = s3.Object('MyBucket', 'My.csv')
csv_file = csv_object.get()['Body'].read().decode('utf-8')

f = StringIO(csv_file)
reader = csv.reader(f, delimiter=',')

list_of_json = []
mydevice = {}

for row in reader:
    mydevice["device"] = row[0]
    mydevice["serial"] = row[1]
    mydevice["software"] = row[2]

    list_of_json.append(mydevice)

软件运行(即不会出错),但它没有产生预期的结果。如果我在 for 循环完成后print(list_of_json),我希望它产生这个;

[{"device":"Dev1", "serial":"Ser1", "software":"software1"},{.....}]

但实际上产生的只是一个空列表......好像 append 语句甚至不存在;

[]

CSV 读取和for row in reader: 部分似乎都工作正常。如果我在 for 循环中执行 print(mydevice),我可以看到它成功通过所有设备,但由于我无法理解的原因,append 语句似乎永远不会将任何内容附加到 list_of_json 列表。

【问题讨论】:

  • 您尝试过使用 DictReader 吗?它会做你似乎想做的事情。您还可以添加一个示例输入 CSV,以便我们可以尝试运行您的代码吗?
  • 您是否在解释器中运行它,在打印出mydevice 并将下一个附加到列表时循环它?

标签: python list csv dictionary


【解决方案1】:

为什么不直接使用csv.DictReader

csv_object = s3.Object('MyBucket', 'My.csv')
csv_file = csv_object.get()['Body'].read().decode('utf-8')

f = StringIO(csv_file)
reader = csv.DictReader(f, ('device', 'serial', 'software'))
list_of_json = [dict(device) for device in reader]
#also don't forget to
f.close() #or use contextlib.closing

【讨论】:

  • 如果是内存文件对象,关闭是否同样重要?
  • 我不确定,但这是一种很好的做法,因为您不再需要阅读器来安全地关闭它
【解决方案2】:

您需要在循环内创建一个新字典:

csv_object = s3.Object('MyBucket', 'My.csv')
csv_file = csv_object.get()['Body'].read().decode('utf-8')

f = StringIO(csv_file)
reader = csv.reader(f, delimiter=',')

list_of_json = []

for row in reader:
    mydevice = {}
    mydevice["device"] = row[0]
    mydevice["serial"] = row[1]
    mydevice["software"] = row[2]
    list_of_json.append(mydevice)

【讨论】:

  • 这是真的,但不能解释为什么没有附加到列表中。由于代码在问题中,我希望多次添加同一个字典。
  • 啊!那成功了-谢谢。知道为什么在 for 循环内定义 Dict 有效,但在外部定义却不行吗?
  • 在循环之外定义它意味着您每次都覆盖现有的键/值。在循环内部,您每次都在创建新对象,因此更改不会影响前一行的数据。
  • 是的,每次都需要新建一个字典对象。
  • 但是,为什么他得到一个空列表而不是一个相同字典的列表(即他声称他得到了 [])?
猜你喜欢
  • 2015-09-25
  • 2015-09-30
  • 2014-11-11
  • 2018-04-07
  • 1970-01-01
  • 2016-11-20
  • 2017-08-08
  • 2015-12-24
  • 1970-01-01
相关资源
最近更新 更多