Добавление новых значений ключа в словарь, импортированный из CSV-файла?

Извините, но я не могу использовать панд.

У меня есть пример входного CSV-файла, который выглядит так:

Alfa,Beta,Charlie,Delta,Echo,Foxtrot,Golf,Hotel,India,Juliett,Kilo
A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1
A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2
A3,B3,C3,D3,E3,F3,G3,H3,I3,J3,K3
A4,B4,C4,D4,E4,F4,G4,H4,I4,J4,K4
A5,B5,C5,D5,E1,F5,G5,H5,I5,J5,K5
A6,B6,C6,D6,E6,F6,G6,H6,I6,J6,K6
A7,B7,C7,D7,E7,F7,G7,H7,I7,J7,K7
A8,B8,C8,D8,E8,F8,G8,H8,I8,J8,K8
A9,B9,C9,D9,E9,F9,G9,H9,I9,J9,K9

Тогда мой пример кода выглядит так:

import csv

fieldnames_dict = {
    'Beta': 'Beta_New',
    'Echo': 'Echo_New',
    'Foxtrot': 'Foxtrot_New_ALL',
    'Hotel': 'Hotel_New',
    'India': 'India_New',
    'Charlie': 'Charlie_New'
}

with open("book1.csv", "r", encoding = "utf-8", errors='ignore') as csv_in:
    with open("xtest_file.csv", "w", encoding = "utf-8", errors='ignore') as csv_out:
        reader = csv.DictReader(csv_in, delimiter=',', quotechar='"')
        writer = csv.DictWriter(csv_out, delimiter=',', quotechar='"',
                                fieldnames=list(fieldnames_dict.values()))
        writer.writeheader()
        for row_in in reader:
            row_out = {new: row_in[old] for old, new in fieldnames_dict.items()}
            writer.writerow(row_out)

Итак, вот как ДОЛЖЕН выглядеть выходной csv:

Beta_New,Echo_New,Foxtrot_New_ALL,Tango,Victor,Hotel_New,India_New,Charlie_New
B1,E1,F1,T1,V1,H1,I1,C1
B2,E2,F2,T1,V1,H2,I2,C2
B3,E3,F3,T1,V1,H3,I3,C3
B4,E4,F4,T1,V1,H4,I4,C4
B5,E5,F5,T1,V1,H5,I5,C5
B6,E6,F6,T1,V1,H6,I6,C6
B7,E7,F7,T1,V1,H7,I7,C7
B8,E8,F8,T1,V1,H8,I8,C8
B9,E9,F9,T1,V1,H9,I9,C9

Таким образом, все ключи в словаре должны быть уникальными (поэтому добавление двух пустых строковых ключей в fieldnames_dict невозможно). Тем не менее, все ключи в fieldnames_dict уже должны существовать во входном CSV-файле из-за row_in[old] в понимании словаря {new: row_in[old] for old, new in fieldnames_dict.items()}. Это означает, что мне придется добавлять/добавлять новые ключи в конце, но как добавить ключи "Tango,Victor" и значения между "Foxtrot_New_ALL" и "Hotel_New"?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я чувствую, что вы неправильно поняли, как работает DictWriter.

Когда вы указываете fieldnames=..., DictWriter не волнует куда, откуда берутся имена этих полей, если это список строк.

Когда вы передаете словарь writerow(), DictWriter просматривает fieldnames, который вы дали ему ранее, чтобы решить, какие ключи из этого словаря выбрать и в каком порядке.

Так что все, что имеет значение, это то, что

  1. fieldnames — это список имен столбцов в том порядке, в котором вы хотите, чтобы столбцы были в выходном файле.
  2. любой дикт, который вы передаете writerow, содержит все поля, указанные в fieldnames. Порядок столбцов определяется fieldnames, поэтому порядок ключей этого словаря не имеет значения.

Имея это в виду, вы можете создать список, содержащий имена ваших новых столбцов, которые будут отдельный из словаря, который сообщает вам, как переименовываются старые столбцы.

fields = ['Beta_New',
 'Echo_New',
 'Foxtrot_New_ALL',
 'Tango',
 'Victor',
 'Hotel_New',
 'India_New',
 'Charlie_New']

column_rename_dict = {
    'Beta': 'Beta_New',
    'Echo': 'Echo_New',
    'Foxtrot': 'Foxtrot_New_ALL',
    'Hotel': 'Hotel_New',
    'India': 'India_New',
    'Charlie': 'Charlie_New'
}

Затем вы используете fields в качестве аргумента fieldnames своему писателю и убедитесь, что любые диктовки, которые вы ему передаете, содержат все эти имена полей.

ctr = 1

with open(...) as csv_in, open(...) as csv_out:
    reader = csv.DictReader(csv_in)
    writer = csv.DictWriter(csv_out, fieldnames=fields)
    writer.writeheader()
    for row_in in reader:
        # Convert the old field names to new field names
        row_out = {new: row_in[old] for old, new in column_rename_dict.items()}

        # Set values for extra keys
        row_out["Tango"] = f"T{ctr}"
        row_out["Victor"] = f"V{ctr}"
        ctr += 1
        
        # Write the row
        writer.writerow(row_out)

Что дает вам ваш новый csv:

Beta_New,Echo_New,Foxtrot_New_ALL,Tango,Victor,Hotel_New,India_New,Charlie_New
B1,E1,F1,T1,V1,H1,I1,C1
B2,E2,F2,T2,V2,H2,I2,C2
B3,E3,F3,T3,V3,H3,I3,C3
B4,E4,F4,T4,V4,H4,I4,C4
B5,E1,F5,T5,V5,H5,I5,C5
B6,E6,F6,T6,V6,H6,I6,C6
B7,E7,F7,T7,V7,H7,I7,C7
B8,E8,F8,T8,V8,H8,I8,C8
B9,E9,F9,T9,V9,H9,I9,C9

Другие вопросы по теме