Запись словарей с разными ключами в файл CSV

#python #python-3.x #csv #dictionary

#python #python-3.x #csv #словарь

Вопрос:

У меня есть несколько словарей:

 d1 = {'name':'jon','age':4}
d2 = {'name':'joe','age':34,'height':100}
 

У меня есть другие словари, не перечисленные здесь, с некоторыми другими ключами, но у них есть некоторые общие ключи с d1 и d2 .

 import csv
with open('file.csv', 'a') as f:
    wr = csv.writer(f) 
    wr.writerow(d1.values())
    wr.writerow(d2.values())
 

Конечно, это не помещает данные в правильные столбцы. Это также не делает заголовки необходимыми. Как мне настроить это так, чтобы каждый ключ из каждого словаря становился заголовком, а значения помещались в нужные места при записи информации в CSV?

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

1. Используете ли вы pandas в своем проекте?

2. @adirabargil нет

Ответ №1:

Попробуйте использовать csv.DictWriter(f, fieldnames=csv_columns) вместо csv.writer(f) того, чтобы проверять документацию здесь. Что касается csv_columns , если вы заранее не знаете всех имен столбцов, вы можете перебрать все словари, найти уникальные и добавить их в список.

Я написал пример ниже.

 import csv

d1 = {'name':'jon', 'age':4}
d2 = {'name':'joe', 'age':34, 'height':100}

csv_columns = ['name', 'age', 'height']

with open('file.csv', 'a') as f:
    wr = csv.DictWriter(f, fieldnames=csv_columns)
    wr.writeheader()
    wr.writerow(d1)
    wr.writerow(d2)
 

Ответ №2:

Я думаю, что лучший способ справиться с этим — создать класс, который отслеживает все дикты, которые вы добавляете в него, а затем записывает файл для вас.

Этот класс позволит вам добавлять столько dicts, сколько вы хотите, и будет отслеживать все поля и добавлять их в файл соответствующим образом.

 class CsvDictWriter:
    def __init__(self):
        self.dicts = []
        self.fields = set()

    def add_dict(self, obj: dict):
        self.dicts.append(obj)
        self.fields.update(obj.keys())

    def write(self, file_name: str):
        with open(file_name, 'w') as fp:
            dw = DictWriter(fp, self.fields, restval='')
            dw.writeheader()
            for obj in self.dicts:
                dw.writerow(obj)


d1 = {'name': 'jon', 'age': 4}
d2 = {'name': 'joe', 'age': 34, 'height': 100}

cdw = CsvDictWriter()
cdw.add_dict(d1)
cdw.add_dict(d2)
cdw.write('file.csv')
 

Ответ №3:

Вам понадобится список всех возможных ключей и порядок, в котором вы хотите, чтобы они были записаны в csv. Вы не сможете создать файл «на лету», поскольку не будете знать, какие ключи и в каком порядке содержит каждый словарь; если вы не проверите все словари, прежде чем начать записывать их в файл.

Используя список заголовков (ключей) и диктофон, вы можете затем просмотреть каждый из них и вывести в файл.

Параметры класса DiscWriter имеют a restval , вам это понадобится, поскольку не все ваши словари имеют все ключи. Он описывается как:

Необязательный параметр restval указывает значение, которое будет записано, если в словаре отсутствует ключ в fieldnames .