Мне нужно распечатать разные словари с разными полями, ValueError: dict содержит поля не в именах полей:

У меня есть 4 словаря, и некоторые поля отсутствуют во всех 4. Я получаю эту ошибку

ValueError: dict contains fields not in fieldnames: 'from', 'Command'

Прочитав некоторые документы, я нашел параметр extrasaction='игнорировать' для DictWriter, но он пропускает некоторые поля в файле CSV. Мне нужны все поля в файле CSV, даже если они пусты для некоторых словарей. Насколько я понимаю, это просто печать общих полей.

Словари:

{'Command': 'DELETE', 'table': 'abc', 'from': 'abc', 'where_expr': 'c = book'}

{'Command': 'SELECT', 'columns': 'a b', 'table': 'tab1', 'from': 'tab1'}

{'Command': 'INSERT', 'table': 'xyz', 'into': 'xyz', 'columns': 'pencil pens', 'values': '200 20'}

{'Command': 'UPDATE', 'table': 'Student', 'columns': 'NAME', 'values': 'PRATIK', 'where_expr': 'a = 100'}

Я включил экстрасекцию из-за ошибки.

with open('del.csv', 'w') as f:  
    write = csv.DictWriter(f, dict4.keys(),extrasaction='ignore') 
    write.writeheader()
    write.writerow(dict5)
    write.writerow(dict6)
    write.writerow(dict7)
    write.writerow(dict8)

Вывод выглядит примерно так: (Я использовал запятые для разделения полей. Пустые пробелы означают пустые поля (они не имеют значения))

table| columns|values| where_expr

abc, , ,c = book

tab1,a b, , ,

xyz, pencil pens,200 20,

Student ,NAME, PRATIK, a = 100

Отредактировано: требуемый результат: (Пустые пробелы означают пустые поля) Я хотел бы опубликовать файл CSV.

Command|Table|Columns|From|Where_expr|Into|Values

DELETE,abc, ,abc,c = book, , ,

SELECT,tab1, a b,tab1, , , ,

INSERT,xyz,pencil pens, , ,xyz, 200 20

UPDATE, student,name, ,a = 100, , PRATIK

опубликовать желаемый результат

RomanPerekhrest 13.06.2019 13:39

Разместил @RomanPerekrest

HAH 13.06.2019 13:49

мы могли бы иметь другой порядок полей?

RomanPerekhrest 13.06.2019 13:51

Да заказ не проблема

HAH 13.06.2019 14:01
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать фрейм данных pandas для загрузки всех словарей в список и создания CSV-файла из этого фрейма данных. Попробуй это :

import pandas as pd
d1 = {'Command': 'DELETE', 'table': 'abc', 'from': 'abc', 'where_expr': 'c = book'}
d2 = {'Command': 'SELECT', 'columns': 'a b', 'table': 'tab1', 'from': 'tab1'}
d3 = {'Command': 'INSERT', 'table': 'xyz', 'into': 'xyz', 'columns': 'pencil pens', 'values': '200 20'}
d4 = {'Command': 'UPDATE', 'table': 'Student', 'columns': 'NAME', 'values': 'PRATIK', 'where_expr': 'a = 100'}
d = [d1, d2, d3, d4]
d2 = []
col = ['Command', 'table', 'columns', 'from', 'where_expr', 'into', 'values']
for i in d:
    temp = {}
    for c in col:
        if c in i:
            temp[c] = i[c]
        else:
            temp[c] = ''
    d2.append(temp)
df2 = pd.DataFrame(d2, columns=col)
df2.columns = [c.capitalize() for c in col]
df2.to_csv('test21.csv', index=False, sep=',')

Выход (содержимое CSV-файла):

Command,Table,Columns,From,Where_expr,Into,Values
DELETE,abc,,abc,c = book,,
SELECT,tab1,a b,tab1,,,
INSERT,xyz,pencil pens,,,xyz,200 20
UPDATE,Student,NAME,,a = 100,,PRATIK

Именно то, что я хочу! Можете ли вы объяснить мне, что делает второй аргумент columns=col в DataFrame()? А что такое index=False. Я только начал изучать панд,

HAH 13.06.2019 14:07

@shaikhafizunnisa Если вы print(df2) в левой части будут имена строк, обычно это 0,1,2,3... Чтобы не писать эти имена строк, мы устанавливаем index=False. И параметр columns=col говорит, что при создании этого кадра данных используйте только список col в качестве заголовков в столбцах фрейма данных. Взгляните на это

Arkistarvh Kltzuonstev 13.06.2019 14:13
Ответ принят как подходящий

С операцией set.union (для случая с динамическим количеством столбцов):

import csv

dict5 = {'Command': 'DELETE', 'table': 'abc', 'from': 'abc', 'where_expr': 'c = book'}
dict6 = {'Command': 'SELECT', 'columns': 'a b', 'table': 'tab1', 'from': 'tab1'}
dict7 = {'Command': 'INSERT', 'table': 'xyz', 'into': 'xyz', 'columns': 'pencil pens', 'values': '200 20'}
dict8 = {'Command': 'UPDATE', 'table': 'Student', 'columns': 'NAME', 'values': 'PRATIK', 'where_expr': 'a = 100'}

with open('names.csv', 'w', newline='') as csvfile:
    # `initial_fieldnames` are your dict4 keys
    initial_fieldnames = ["table", "columns", "values", "where_expr"]
    fieldnames = sorted(set(initial_fieldnames).union(*[dict5, dict6, dict7, dict8]))
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction='ignore')

    writer.writeheader()
    writer.writerows([dict5, dict6, dict7, dict8])

names.csv содержание:

Command,columns,from,into,table,values,where_expr
DELETE,,abc,,abc,,c = book
SELECT,a b,tab1,,tab1,,
INSERT,pencil pens,,xyz,xyz,200 20,
UPDATE,NAME,,,Student,PRATIK,a = 100

Так что все, что мне нужно было сделать, это вручную указать имена некоторых полей, а затем выполнить объединение остальных. Спасибо!

HAH 13.06.2019 14:14

@shaikhafizunnisa, Нет, не вручную. initial_fieldnames — это указатель для ваших dict4 ключей. Как вы не выложили dict4. Замените initial_fieldnames своим dict4.keys()

RomanPerekhrest 13.06.2019 14:15

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