【问题标题】:Using dictionary keys as coordinates when writing to csv写入 csv 时使用字典键作为坐标
【发布时间】:2015-08-10 13:19:13
【问题描述】:

我有一个字典,其中单元格坐标作为键,所需的单元格内容作为值,例如:

dict1 = {'AN32': '2', 'AZ17': '47', ect...}

单元格范围是D4: AZ52

我想将其写入 csv 文件。

我在设计时遇到的问题是字典不一定按字母或数字顺序排列,如上例所示。

我知道如何写入 .csv 文件

with open('example.csv', 'w') as f:

    for i in dict1:

        f.write(str(dict1[i]) + ',')

这将按顺序写出值,这意味着它们不会在正确的单元格中,我需要它们在由其键指定的单元格中。

【问题讨论】:

  • 你想要的输出在 csv 文件中应该是怎样的?
  • 我假设您希望 CSV 中的数据有 48 列和 48 行。对吗?
  • 正确,48 列,48 行。
  • 你可以使用OrderedDict(它会按字母顺序存储键)吗?

标签: python csv dictionary


【解决方案1】:

此代码使用列表推导来构建每一行。

首先,我们使用来自string 模块的uppercase 字符串创建列标签列表,然后使用简单的列表推导构建所有列标签的列表。

然后我们使用稍微复杂一点的列表推导式,它通过将每个列标签与当前行号(转换为字符串)组合来生成一个键。该键被传递给dict1.get() 方法以获取与该键关联的值。我们使用空字符串'' 作为.get() 的第二个参数,这样如果字典中不存在键,我们就会得到一个空字符串。

然后我们使用.join() 方法连接所有这些字符串,用逗号分隔。

from string import uppercase

#Make a list of the column letters
cols = list(uppercase[3:]) + ['A' + c for c in uppercase]
#print(cols)

with open('example.csv', 'w') as f:
    for r in range(4, 53):
        row = ','.join([dict1.get(c + str(r), '') for c in cols])
        f.write(row + '\n')

如果dict1 中的值实际上是int 而不是字符串,那么您需要在尝试加入它们之前将它们转换为字符串。将列表理解更改为

row = ','.join([str(dict1.get(c + str(r), '')) for c in cols])

即使有些值是字符串而有些是数字,这也能应付。

【讨论】:

  • 我已经阅读并理解了该解决方案,并且非常优雅。然而它也抛出一个错误:TypeError: sequence item 12: expected string, into found"
  • @JoeSmart:我怀疑错误消息实际上是“预期的字符串,找到了 int”。 dict1 中的所有值都是字符串吗?我假设他们是,从你的样本数据。顺便说一句,我刚刚注意到您的示例数据中有一个键 'Z2' 但您还说单元格范围是 D4: AZ52
  • 我的样本数据不清楚,我很抱歉。我给出的范围是正确的。我只是为样本数据键入随机坐标作为结构示例。我会仔细检查它们是否都是字符串。
  • @JoeSmart:好的。您应该修复问题中的 dict1 行。我已经更新了处理 int 值的答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-04
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
相关资源
最近更新 更多