Python 为什么不是';这个嵌套的for循环在csv.reader对象上工作吗?

Python 为什么不是';这个嵌套的for循环在csv.reader对象上工作吗?,python,csv,Python,Csv,我很难让脚本正常工作,我怀疑我忽略了一些简单的东西。我在下面粘贴了一个简化脚本,它为类似的数据集生成相同类型的错误 下面的脚本用于获取csv,其中每一行表示给定状态的轮询数据。使用一个州列表,我想迭代csv数据,找到每个州的最新民意调查结果,并生成一个列表,总结该州的一个属性(本例中民主党候选人的投票百分比)。我需要考虑csv文件中的“行”可能没有任何特定顺序,并且某些“状态”可能没有csv中的数据 此示例脚本为第一个州(“阿拉巴马州”)生成正确的输出,但无法找到州列表中任何其他州的数据。为什么

我很难让脚本正常工作,我怀疑我忽略了一些简单的东西。我在下面粘贴了一个简化脚本,它为类似的数据集生成相同类型的错误

下面的脚本用于获取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

读取CSV文件的循环“用完了”。它不是每次通过外循环重置的

无论如何,一个更好的策略是在执行任何其他操作之前,先读取CSV文件一次,然后将数据加载到内存中并循环。您当前的预期逻辑是读取每个州的整个CSV文件,每次只提取一个州的数据,这将比必须的慢很多(大约慢50倍)

至于内存中的数据结构,您已经看到列表列表是有效的。如果有一本字典,你会得到更好的服务,因为字典的关键是国家。这样你就不必对每个州都进行循环