#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 .