2012-08-24 45 views
0

我無法讓腳本工作,我懷疑有一些簡單的東西可以忽略。我在下面粘貼了一個簡化的腳本,爲類似的數據集生成相同類型的錯誤。爲什麼這不是嵌套循環工作在csv.reader對象上?

下面的腳本是指取,其中每行代表一個給定的狀態輪詢的CSV。使用狀態的列表,我想遍歷CSV數據,以找出每個州的最新民意調查和生成總結了該州的一個屬性(民主黨候選人的百分比投票在這個例子中列出的清單)。我需要考慮到csv文件中的「行」可能沒有任何特定順序,並且某些「狀態」可能沒有csv中的數據。

此示例腳本生成第一狀態(「亞拉巴馬」號)的右輸出,但它無法找到數據,任何在美國列表中的其他狀態。爲什麼?

注1 - 該腳本獲取csv文件 注2 - 而不是獲取的CSV文件中的腳本按預期工作,如果,我公司提供的調查數據作爲一個列表的列表

感謝您的幫助。

import csv, httplib2, cStringIO 

h = httplib2.Http('.cache') 
url = 'http://www.electoral-vote.com/evp2012/Pres/pres_polls.csv' 
headers, data = h.request(url) 

states = [ 
      "Alabama", 
      "Alaska", 
      "Arizona", 
      "Arkansas", 
      "California", 
      "Colorado", 
      "Connecticut", 
      "Delaware", 
      "Florida", 
      "Georgia", 
      "Hawaii", 
      "Idaho", 
      "Illinois", 
      "Indiana", 
      "Iowa", 
      "Kansas", 
      "Kentucky", 
      "Louisiana", 
      "Maine", 
      "Maryland", 
      "Massachusetts", 
      "Michigan", 
      "Minnesota", 
      "Mississippi", 
      "Missouri", 
      "Montana", 
      "Nebraska", 
      "Nevada", 
      "New Hampshire", 
      "New Jersey", 
      "New Mexico", 
      "New York", 
      "North Carolina", 
      "North Dakota", 
      "Ohio", 
      "Oklahoma", 
      "Oregon", 
      "Pennsylvania", 
      "Rhode Island", 
      "South Carolina", 
      "South Dakota", 
      "Tennessee", 
      "Texas", 
      "Utah", 
      "Vermont", 
      "Virginia", 
      "Washington", 
      "West Virginia", 
      "Wisconsin", 
      "Wyoming" 
      ] 

csv_input = cStringIO.StringIO(data) 
csv_output = csv.reader(csv_input) 

# sample row => 
#['Day', 'Len', 'State', 'EV', 'Dem', 'GOP', 'Ind', 'Date', '', '', '', '', '', '', '', 'Pollster'] 
#[' 1.0', '1', 'Wyoming', '3', '33', '65', '', 'Jan 01', '', '', '', '', '', '', '', 'Election 2008-1'] 

percent_dem_by_state = [] 

for state in states: 
    poll_day = 0 
    percent_dem_for_this_state = [state, None] 
    for row in csv_output: 
     if (state == row[2]) and (float(row[0]) > poll_day): 
      percent_dem_for_this_state = [state, int(row[4])] 
      poll_day = float(row[0]) 
    percent_dem_by_state.append(percent_dem_for_this_state) 

for elem in percent_dem_by_state: 
    print elem 

回答

1

您的循環讀取CSV文件「使用它」。它不會每次通過外部循環重置。

一個更好的策略是反正通過CSV讀取文件一次,別人做什麼,將數據加載到內存中,並遍歷之前。您當前的旨在通過爲每個狀態下的整個CSV文件讀取邏輯,只是挑選出每一次數據的一個狀態的價值,將是方式,方法比它慢必須是(約50慢倍)。

至於在內存中的數據結構,你已經看到,清單列表的作品。你會更好地服務於字典,其中的關鍵是國家。那麼你不必爲每個狀態循環整個事情。