2017-02-13 45 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