Добавьте новые значения словаря в существующий csv

#python #csv

Вопрос:

Я пытаюсь добавить 2 новых столбца в существующий файл в той же программе. Файл csv генерируется предыдущей функцией.

Просмотрев здесь много ответов, я попробовал это, но это не сработало, потому что я не смог найти никаких ответов, используя csv dict writer в них, они были все csv writer . Это просто создает новый файл с этими 2 столбцами в них. Могу ли я получить некоторую помощь в этом?

 for me, sp in zip(meds, specs):
    print(me.text, sp.text)
    dict2 = {"Medicines": me.text, "Specialities": sp.text}
    with open(f'Infusion_t{zip_add}.csv', 'r') as read, 
            open(f'(Infusion_final{zip_add}.csv', 'a ', encoding='utf-8-sig', newline='') as f:
        reader = csv.reader(read)
        w = csv.DictWriter(f, dict2.keys())
        for row in reader:
            if not header_added:
                w.writeheader()
                header_added = True
            row.append(w.writerow(dict2))
 

Комментарии:

1. Ваши вложенные циклы будут создавать перекрестный продукт между списками и файлом CSV, это то, что вы хотите? Или они должны быть в переписке 1 к 1?

2. для 1 значения в строке в предыдущем файле они должны добавить несколько строк для одного и того же индекса, но в 2 разных столбцах. Я не дошел до этой части, потому что на данный момент она даже не написана. Как и в предыдущем файле, есть имя певца … это его песни и альбомы … что-то в этом роде.

Ответ №1:

Вам нужно добавить новые столбцы row , а затем записать row их в выходной файл. Вам не нужен словарь или DictWriter .

Вы также можете открыть выходной файл только один раз перед циклом и записать туда заголовок, а не каждый раз через основной цикл.

 with open(f'(Infusion_final{zip_add}.csv', 'w', encoding='utf-8-sig', newline='') as f:
    w = csv.writer(f)
    w.writerow(['col1', 'col2', 'col3', ..., 'Medicines', 'Specalities']) # replace colX with the names of the original columns
    for me, sp in zip(meds, specs):
        print(me.text, sp.text)
        with open(f'Infusion_t{zip_add}.csv', 'r') as read:                
            reader = csv.reader(read)
            for row in reader:
                row.append(me.text)
                row.append(sp.text)
                w.writerow(row)
 

Комментарии:

1. Вы были правы, он повторяет заголовки. Я должен открыть его только один раз. Огромное спасибо, я пробовал это уже целый час.

2. Ваша header_added переменная должна предотвращать повторение заголовков. Но этот способ проще.