【问题标题】:python:why whis code only loop one time?python:为什么代码只循环一次?
【发布时间】:2017-12-24 22:51:59
【问题描述】:

我倾向于读取两个 csv 文件并按键名打印特定列。 首先,我有一个我的密钥名称列表,例如 key = [a,b,c]

我有以下代码:

with open('./file/report.csv', 'rb') as csvfile,open('./file/all.csv','rb') as csvfile2:
    reader2 = csv.DictReader(csvfile)
    reader3 = csv.DictReader(csvfile2)
    for i in key:
         for row in reader2: 
             for row2 in reader3:
                 if row['Case Id'] == i and row2['name'] == i:
                     a=row['Status']
                     b = row2['result']
                     print a,b

两个 csv 文件:

report.csv:                         all.csv:        
Case Id       Status                 name           result   
  a             111                   a               1111
  b             222                   b               2222
  c             333                   c               3333

我的预期结果是它会循环三次,因为key list.expected 中的三个元素应该是这样的:

111 1111
222 2222
333 3333

但实际结果是:

111 1111

它只循环一次。我是编码方面的新手,需要一些帮助!谢谢!!

【问题讨论】:

    标签: python-2.7 loops


    【解决方案1】:

    Reader 是一次性迭代器,在一次迭代后被耗尽。

    这意味着第二次你在reader3 中没有任何东西,因为你已经耗尽了它。

    试试这个:

    reader2 = list(csv.DictReader(csvfile)) # optional
    reader3 = list(csv.DictReader(csvfile2)) # must
    

    如果您使用的是大文件,请使用更复​​杂的匹配或每次都重新打开文件。

    【讨论】:

      【解决方案2】:

      CVSReader 视为文件的一次性迭代器。一旦你读了一行,你就不能回去了,一个读者已经筋疲力尽了,你不能从文件中读取更多的数据而不重新创建它。一个好的做法是将两个读者都读入内存,然后复习它们。例如:

      list2 = list(reader2);
      list3 = list(reader3);
      
      for i in key:
           for row in list2: 
               for row2 in list3:
                   if row['Case Id'] == i and row2['name'] == i:
                       a=row['Status']
                       b = row2['result']
                       print a,b
      

      【讨论】:

        猜你喜欢
        • 2017-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多