2016-07-28 58 views
0

我正在使用Python 3.5。我上傳了一個CSV文件並將其製作成字典。但是,每個鍵的多個值的列表是一個字符串,而不是一個整數。我怎樣才能將每個鍵的值轉換爲整數?如何將字典列表值轉換爲整數?

此外,有沒有辦法讓將來的CSV導入自動將字典值列表變成整數?

到目前爲止,這是我:

import csv 
reader = csv.reader(open('filename.csv')) 
dictname = {} 
for row in reader: 
    key = row[0] 
    if key in dictname: 
     pass 
    dictname[key] = row[1:] 

print dictname 
+6

示例數據在哪裏? –

回答

0

我使用的功能首先檢查是否值是一個字符串/ Unicode的。如果是這樣,則它試圖將其轉換爲浮動,例如, 「1,234.45」 - > 1234.45。如果失敗或者該值不是字符串/浮點數,則該函數將不變地返回。

這個函數然後用於列表理解來填充字典。

請注意,if key in dictname: pass塊不會執行任何操作。如果數據中存在重複密鑰,則有三種選擇:

1)用具有相同鍵值(這是當前正在發生的)的新行覆蓋現有密鑰的數據。

2)僅使用第一次出現的關鍵行。在這種情況下,請將pass更改爲continue

3)嘗試聚合數據。這更復雜,超出了你原來的問題範圍,所以我會讓你找出或發佈一個覆蓋這個範圍的新問題。

def convert_to_numeric(value): 
    if isinstance(i, (str, unicode)): 
     try: 
      result = float(value) 
     except: 
      pass # Returns result on next line. 
    return result 

for row in reader: 
    key = row[0] 
    if key in dictname: 
     pass # This doesn't do anything. Use `continue` to avoid overwriting. 
    dictname[key] = [convert_to_numeric(i) for i in row[1:]] 
0

如果行包含以下字符串格式的整數列表:

dictname[key] = [int(elt) for elt in row[1:] if elt.isdigit()] 

應該做的伎倆

+0

我可以對所有鑰匙執行嗎? – mrmichael

+0

您應該可以像我從列表'row [1:]'中取出所有數字並從中創建一個int列表。所以,只要元素具有數字格式,就應該可以工作。 – HolyDanna

+0

我的意思是,我可以立即選擇所有的密鑰,而不必一一瀏覽。 – mrmichael

0

您可以使用pandas並指定轉換器功能。事實上,你甚至可能不需要這樣做,因爲它智能地解析CSV文件。

import pandas as pd 

df = pd.read_csv('filename.csv') 

如果需要轉換器功能:

df = pd.read_csv('filename.csv',converters={'yourintegercolumn':int}) 
+0

雖然這是一個選項 - 它可能是一個堅果的方式取決於什麼OP正在試圖做一個大錘...... –

+0

@JonClements:好點。如果你認爲我應該,我會刪除這個答案。 – bernie

+0

由你決定 - 畢竟這是一個有效的答案......除非它恰好發生,OP將在後處理工作上做它需要熊貓,我不確定它是完全有用的,雖然... –