2016-03-24 21 views
2

Bir csv belgesine geçiş yapmak istiyorum ve sık sık değerler için bir sonraki satırı kontrol edin, ancak aynı satır numarasına bağlı kalın. .next(), bir şekilde, bir şekilde geri dönmeyecek şekilde, benim için çalışmayacak bir satır atlıyor. Bunu yapmanın basit bir yolu var mı? İkili/döngüyü denedim ancak dosya büyükse çok uzun sürüyor. Benim örnek kod:Python - csv dosyasından geçiş yapın ve sonraki satıra bakın

file1 = open("name.csv", 'rb') 
reader = csv.DictReader(file1) 
new_rows_list = [] 

for row in reader: 
    if row['IsFixated'] == 'TRUE': 
     new_row = [row['Result'], 'Fixation'] 
     new_rows_list.append(new_row) 
    else: 
     new_row = [row['Result'], 'Saccade'] 
     new_rows_list.append(new_row) 
     nextRow = reader.next() # check for next row ?? 
     if nextRow['IsFixated'] == 'TRUE': 
      new_rows_list = CheckPreviousPositions(new_rows_list) 

file1.close() 

cevap

2
reader1,reader2 = itertools.tee(csv.DictReader(file1)) 
#this creates two copies of file iterators for the file 
next(reader2) #skip first line in second filehandle 
for line,next_line in itertools.izip(reader1,reader2): 
    #do something? 

galiba ... belki?

0

sadece bir sonraki satırını kontrol etmek gerekirse bu jeneratör işlevi Bu dosya açılır ve curr_and_next listeye birinci ve ikinci satırı ekleyin ve onu döndüren hile

def next_reader(file_name): 
    with open(file_name) as f: 
     reader = csv.reader(f) 
     check = 0 
     curr_and_next = [] 
     while True: 
      if check == 0: 
       first = reader.next() 
       second = reader.next() 
       curr_and_next = [first, second] 
       check = 1 
      else: 
       curr_and_next = [curr_and_next[1], reader.next()] 
      yield curr_and_next 

yapmalıdır. Sonraki herhangi bir çağrıda, ikinci değeri curr_and_next dosyasında ilk noktaya taşır ve ardından dosyadaki bir sonraki satırı ikinci noktaya ekler. Şimdi bir defada bir satır vermek yerine, bu jeneratör bir sonraki satırı ve onu takip eden satırı içeren bir liste oluşturacaktır. Örneğin satır içeren bir csv dosyası alpha.csv varsa:

a,b 
c,d 
e,f 

ve bir döngü var:

for x in next_reader('alpha.csv'): 
    print x 

bu yazdırır:

[['a','b'],['c','d']] 
[['c','d'],['e','f']] 

Not geçen o csv dosyanızdaki satır yalnızca son yinelemede görünecektir. (Son baskı için [['e','f'],None] gibi bir şey almayacaksınız).

İlgili konular