仅当行不存在时才写入CSV

时间:2019-10-11 12:40:40

标签: python-3.x csv

我正在使用以下代码将数组保存到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。

什么是最好的方法?

亲切的问候

1 个答案:

答案 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]anntypeexp_idrun_mumber的列和run_id。在这些列上添加唯一约束,您将具有相同的功能。