我正在使用以下代码将数组保存到csv文件中:
def save_annotations(**kwargs):
ann = request.get_json()
print(ann)
filename = ann[3].split('.')[0]
run_id = ann[4]
run_number = ann[4].split('/')[0]
exp_id = ann[4].split('/')[1]
ann_type = ann[2]
if ann_type == 'wrongDetection':
with open(f"/code/data/mlruns/{run_number}/{exp_id}/wrong_annotations_{filename}_{run_id.replace('/', '_')}.csv",'a') as w_ann:
writer = csv.writer(w_ann, delimiter=',')
writer.writerow(ann[0:2])
w_ann.close()
else:
with open(f"/code/data/mlruns/{run_number}/{exp_id}/new_detections_{filename}_{run_id.replace('/', '_')}.csv",'a') as w_ann:
writer = csv.writer(w_ann, delimiter=',')
writer.writerow(ann[0:2])
w_ann.close()
但是,我不想在csv文件中重复行。我只想在ann[0]
和ann[1]
不在csv中的情况下写入csv。
什么是最好的方法?
亲切的问候
答案 0 :(得分:1)
一种方法是收集集合中已经存在的值,并在处理之前检查新值以查看它们是否在集合中。您需要为每个csv文件设置一个集合。
例如:
def build_set(filename):
with open(filename, 'r') as f:
reader = csv.reader(f)
# Skip header row, if necessary
next(reader)
return {tuple(row[0:2]) for row in reader}
然后在您的函数中可以执行以下操作:
if tuple(ann[0:2]) in set_for_this_file:
continue
set_for_this_file.add(tuple(ann[0:2]))
# write data to file
构建集将需要在每次执行程序时通读所有csv文件,如果文件很大和/或很多,这可能效率不高。
更有效的方法可能是将数据存储在数据库表中,其中包含ann[0]
,ann[1]
,anntype
,exp_id
,run_mumber
的列和run_id
。在这些列上添加唯一约束,您将具有相同的功能。