我有一个递归函数,它从文件中读取侦察记录列表,然后按照ID的顺序将其添加到列表框中。使用addScouts(1)
调用该函数。函数如下:
def addScouts(self,I):
i = I
with open(fileName,"r") as f:
lines = f.readlines()
for line in lines:
if str(line.split(",")[3])[:-1] == str(i):
self.scoutList.insert(END,line[:-1])
i += 1
return self.addScouts(i)
return
我的问题是我的文件ID是按1,2,4,5
排序的,因为在某些时候我删除了ID为3的侦察器。但是,当我运行该功能以重新排序列表框中的侦察员时(该功能)在上面),它只列出了直到并包括ID 3的侦察员。这是因为当i = 3
时,文件中没有任何项等于3,所以函数到达结尾并在它获得机会之前返回检查剩余的记录。
文件内容:
Kris,Rice,17,1
Olly,Fallows,17,2
Olivia,Bird,17,4
Louis,Martin,18,5
任何想法是如何解决这个问题的?
答案 0 :(得分:2)
对最后一栏进行排序:
sorted(f,key=lambda x: int(x.split(",")[-1]))
您可以使用bisect查找新数据的放置位置,以便在数据排序一次后对数据进行排序:
from bisect import bisect
import csv
with open("foo.txt") as f:
r = list(csv.reader(f))
keys = [int(row[-1]) for row in r]
new = ["foo","bar","12","3"]
ind = bisect(keys, int(new[-1]))
r.insert(ind,new)
print(r)
输出:
[['Kris', 'Rice', '17', '1'], ['Olly', 'Fallows', '17', '2'], ['foo', 'bar', '12', '3'], ['Olivia', 'Bird', '17', '4'], ['Louis', 'Martin', '18', '5']]
一种更简单的方法是检查具有更高id的第一行,如果没有更高只是追加到结尾:
import csv
with open("foo.txt") as f:
r = list(csv.reader(f))
new = ["foo","bar","12","3"]
key = int(new[-1])
ind = None
for i, row in enumerate(r):
if int(row[-1]) >= key:
ind = i
break
r.insert(ind, new) if ind is not None else r.append(new)
print(r)
输出:
[['Kris', 'Rice', '17', '1'], ['Olly', 'Fallows', '17', '2'], ['foo', 'bar', '12', '3'], ['Olivia', 'Bird', '17', '4'], ['Louis', 'Martin', '18', '5']
要在添加新值时始终保持该文件的顺序,我们只需要写入临时文件,将该行写入正确的位置,然后将原始文件替换为更新的文件:
import csv
from tempfile import NamedTemporaryFile
from shutil import move
with open("foo.csv") as f, NamedTemporaryFile(dir=".", delete=False) as temp:
r = csv.reader(f)
wr = csv.writer(temp)
new = ["foo", "bar", "12", "3"]
key, ind = int(new[-1]), None
for i, row in enumerate(r):
if int(row[-1]) >= key:
wr.writerow(new)
wr.writerow(row)
wr.writerows(r)
break
wr.writerow(row)
else:
wr.writerow(new)
move(temp.name, "foo.csv")
foo.csv之后将按顺序获取数据:
Kris,Rice,17,1
Olly,Fallows,17,2
foo,bar,12,3
Olivia,Bird,17,4
Louis,Martin,18,5
答案 1 :(得分:1)
您可以检查您的列表是否与文件长度相同,如果没有,则再次运行addScouts,如果为true,则结束。像这样:
#ifndef