我正在研究第一个读取支票簿寄存器的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'
。我错过了什么?
答案 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
。