Python 3.6读取csv文件并使用浮点数作为dict键

时间:2017-02-13 00:13:48

标签: python csv dictionary

我正在研究第一个读取支票簿寄存器的python脚本。寄存器详细信息位于csv文件中:

date,chk num,description,amount,cleared state

此外,csv文件是个人支票簿和银行下载的交易的组合。理想情况下,每条记录有两个副本:一个来自支票簿,另一个来自银行。实际上,有些银行记录没有出现在支票簿清单中,还有其他一些奇怪的东西。

如果我在perl中执行此操作,那么我会为每个唯一性级别提供哈希值。我试图在这里使用dicts并且遇到关键值的问题。具体来说,我的第一个唯一性密钥是交易金额。这可能是一个正或负的浮点数,正好有两位小数,没有千位分隔符:a la 1234567.89或-0.24等

import csv

with open('C:/my/bank/docs/combined.csv', 'r') as csvfile:
    reader = csv.reader(csvfile)

    for row in reader:
        #
        # value
        if dataset.get(row[3]) != None:
...

事实证明,文件中的第一个值是-2844.29。我在keyError行上获得if dataset.get(row[3]) != None:。它抱怨关键" -2844.29"。

csv文件没有"引用"因此我认为它被视为float。然后我尝试使用

将其转换为string
        if dataset.get('{:.2f}'.format(row[3])) != None:

但这告诉我:ValueError: Unknown format code 'f' for object of type 'str'。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您可以使用type()功能检查对象的类型。 E.g:

print(type(row[3]))

您还可以检查dataset对象中密钥的类型,看它是否匹配。

无论如何,csv.reader不会将它在csv文件中读取的内容强制转换。您的row对象是list str,如果您的dataset密钥也是str,则无需投放该对象。您得到的错误是因为您尝试使用str代码(实际上专用于数字类型)格式化.f

<强> BUT

当您尝试dataset.get(row[3])时,您的代码应该有效。我认为你的数据集没有正确构建(我在这里看不到这个对象的初始化)你应该尝试完全显示它,以便查看它是否实际上包含键-2844.29作为字符串(你可以检查您的dataset是否实际包含str类型的密钥,而不是float