2013-09-18 4 views
1
import csv 
with open("t1.csv", "rb") as f: 
    reader = csv.reader(f) 
    with open("t2.csv", "rb") as e: 
     reader2 = csv.reader(e) 
     with open("alnew.csv", "wb") as cr: 
      writer = csv.writer(cr) 
      for row in reader: 
       print row + ["XXXXX"] 
       for row2 in reader2: 
         print row2 + ["OOOOO"] 
         if row[0] == row2[3]: 
          new = row + row2 
          writer.writerow(new) 

Не должен ли второй цикл цикла повторяться каждый раз, когда он проходит первый цикл? Кажется, он запускается впервые, когда он проходит цикл.Почему второй цикл цикла повторяется только один раз?

+0

Каков результат первого 'print'? –

+1

Вы можете группировать контексты файлов в одной строке «с», это должно помочь очистить ваш код. Мне тяжело видеть, какой файл принадлежит где. 'с открытым (' t1 ',' w ') как один, открытый (' t2 ',' w ') как два:' – gregb212

+2

'reader2' исчерпан после первого раза. Если вы хотите перебирать его несколько раз, вы должны прочитать его в списке или что-то еще. – cmd

ответ

2

Вам необходимо «сбросить» считыватель. Как написано, reader2 дойдет до конца файла, но не знает, что он должен вернуться к началу.

Чтобы перечитать файл, вы можете повторно открыть файл и начать все заново.

import csv 
with open("t1.csv", "rb") as f: 
    reader = csv.reader(f) 
    with open("alnew.csv", "wb") as cr: 
     writer = csv.writer(cr) 
     for row in reader: 
      print row + ["XXXXX"] 
      with open("t2.csv", "rb") as e: 
       reader2 = csv.reader(e) 
       for row2 in reader2: 
        print row2 + ["OOOOO"] 
        if row[0] == row2[3]: 
         new = row + row2 
         writer.writerow(new) 
+0

Я не думаю, что 'csv.reader' предоставляет метод' seek', не так ли? Это не задокументировано. – zwol

+0

Хорошо, обновляется без поиска. –

0

После того, как вы прочитали t2.csv весь путь до конца, как только читатель (и основной файл) остаются «в конце» файла. Они не будут возвращаться к началу только потому, что вы снова пытались повторить их.

Для обычного файла, который вы могли бы использовать метод seek, чтобы справиться с этим, но (если я не хватает чего-то) csv.reader не метод seek, и, вероятно, не будет счастлив с вами, если вы звоните seek в базовом файле. Поэтому самое простое исправление читать весь из t2.csv в массив: изменение

 reader2 = csv.reader(e) 

в

 reader2 = [row for row in csv.reader(e)] 

Если t2.csv слишком велик для этого, чтобы быть практичным, я думаю, вы должны как вызовите seek(0) на файл, и уничтожьте и заново создайте reader2, каждый раз через внешний цикл.

3

Проблема заключается в том, что вы открываете дескриптор файла для своего второго файла только один раз. второй раз через петлю он уже исчерпан. Файловые дескрипторы, подобные другим генераторам, могут повторяться только один раз без их воссоздания. Вы можете повторно открывать файл каждый раз. Однако в этом случае я предпочел бы itertools.product.

import csv, itertools 
with open("t1.csv", "rb") as f, with open("t2.csv", "rb") as e, with open("alnew.csv", "wb") as cr: 
    reader = csv.reader(f) 
    reader2 = csv.reader(e) 
    writer = csv.writer(cr) 
    for row, row2 in itertools.product(reader, reader2) 
     if row[0] == row2[3]: 
      writer.writerow(row + row2) 
Смежные вопросы