2017-02-13 48 views
0

我正在研究有史以来第一个python脚本来读取支票簿寄存器。寄存器的细节是一个CSV文件:Python 3.6读取csv文件并使用浮动字母作为字典键

date,chk num,description,amount,cleared state 

另外,csv文件是个人支票和银行的交易下载的组合。理想情况下,每份记录有两份:一份来自支票簿,另一份来自银行。事实上,有些银行记录没有出现在支票簿清单和其他一些古怪的事物中。

如果我在perl这样做,那么我会有散列哈希每个级别的唯一性。我尝试在这里使用dicts,并且遇到了关键值问题。具体来说,我的第一个唯一性关键是交易金额。这可能是一个正或负的浮点数正好用两个十进制数字,无千位分隔符:一拉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。我在if dataset.get(row[3]) != None:行上得到keyError。它抱怨关键“-2844.29”。

csv文件不会“引用”该值,因此我认为它被视为float。然后我试着将它与

 if dataset.get('{:.2f}'.format(row[3])) != None: 

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

回答

1

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

print(type(row[3])) 

,你也可以检查dataset对象钥匙的类型,看它是否匹配。

无论如何,csv.reader不会转换它在csv文件中读取的内容。您的row对象是liststr,如果您的dataset密钥也是str,则不需要投下它。您得到的错误是因为您正尝试使用.f代码(实际上专用于数字类型)来格式化str。当你试图dataset.get(row[3])

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