我在尝试返回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);
答案 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()