CSV文件行和列迭代

时间:2013-12-04 22:24:56

标签: python csv row traceback

我在尝试返回csv文件的第1行时遇到了麻烦,该文件基本上包含一串数据:[0,300,30,521,53,462,642]。基本上我正在尝试删除第一列,然后遍历第一行[300,30,521,53,462,642]并将最小值(30)附加到名为“b”的列表中。然后用第二行和第二列重复它,依此类推。但是,我收到一个错误,我不确定它的含义。谁能帮我这个?谢谢。

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 个答案:

答案 0 :(得分:2)

你在删除时耗尽reader - 它类似于读到文件的末尾。这种方法过于复杂。为了满足计算每行最小值的修订目标,忽略第n行中的第n列,我会这样做:

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不使用分号。

答案 1 :(得分: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()