2013-12-04 2 views
0

У меня возникли проблемы с попыткой вернуть строку 1 файла csv, которая в основном содержит строку данных: [0, 300, 30, 521, 53, 462, 642]. В основном я пытаюсь удалить первый столбец, а затем прокрутить первую строку [300, 30, 521, 53, 462, 642] и добавить минимальное значение (30) в список под названием «b». Затем повторите это со второй строкой и вторым столбцом и так далее. Однако я получаю сообщение об ошибке, и я не уверен, что это значит. Кто-нибудь может мне с этим помочь? Спасибо.Иерархия строк и столбцов файла CSV

Traceback (most recent call last): 
    File "travelsales.py", line 25, in <module> 
    nearest(0); 
    File "travelsales.py", line 17, in nearest 
    for i in reader.next(): 
StopIteration 

код Источник:

import time 
import csv 
from itertools import islice 

b = list(); 
reader = csv.reader(open('distance.csv','rU'), delimiter = ' '); 
def delete(column): 
    for i in reader: 
     del i[column]; 

def nearest(row): 
    a = list(); 
    list(islice(reader, row)); 
    for i in reader.next(): 
     a.append(int(i)); 
    print a; 
    b.append(min(a)); 
    del a[:]; 
    print b; 

delete(0); 
nearest(0); 

ответ

2

Вы исчерпали свой reader в удалении - это похоже на чтение до конца файла. Этот подход слишком усложнен. Для удовлетворения пересмотренной цели расчета мин каждой строки, не обращая внимания на п-й столбец в каждом п-й строке, я хотел бы сделать это:

b = [] 
for rownum, line in enumerate(reader): 
    b.append(min(int(x) for x in line[:rownum] + line[rownum + 1:]) 

Поскольку каждый line список уже создан, я думаю, нарезка непосредственно быстрее, чем itertools.islice , Добавление списка по сравнению с itertools.chain Я не так уверен.

min(min(int(x) for x in line[:rownum]), min(int(x) for x in line[rownum + 1:])) 

также может быть стоит проверить.

Кроме того, Python не использует точки с запятой.

+0

Извините, но я, вероятно, должен был упомянуть, что хотел включить несколько строк. Например, у меня есть 4 строки, я хочу удалить первый столбец первой строки, затем найти min, удалить второй столбец второй строки, найти min из оставшихся, а затем удалить третий столбец третьей строка и добавление. – user2998285

+0

Вы всегда игнорируете n-й столбец при поиске min в n-й строке? –

+0

Да, я пытаюсь это сделать, но также хочу, чтобы столбец оставался удаленным, чтобы я мог ссылаться на минимальные значения в n-й строке с остальными столбцами – user2998285

0
import csv 

def read_csv(fname, **kwargs): 
    with open(fname, 'rb') as inf: 
     in_csv = csv.reader(inf, **kwargs) 
     return list(in_csv) 

def nearest(row): 
    return min(int(i) for i in islice(row, 1, None)) 

def main(): 
    data = read_csv('distance.csv', delimiter=' ') 
    b = [nearest(row) for row in data] 

if __name__=="__main__": 
    main()