【问题标题】:I need to print different dictionaries which have different fields, ValueError: dict contains fields not in fieldnames:我需要打印具有不同字段的不同字典,ValueError: dict contains fields not in fieldnames:
【发布时间】:2019-06-13 11:29:08
【问题描述】:

我有 4 个字典,其中一些字段不在所有 4 个中。我收到此错误

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

在阅读了一些文档后,我发现了 DictWriter 的 extrasaction='ignore' 参数,但它在 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 pen', '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)

输出类似于: (我用逗号分隔字段。空格表示空字段(它们没有值))

表|列|值| where_expr

abc, , ,c = 书

tab1,a b, , ,

xyz,铅笔,200 20,

学生,姓名,PRATIK,a = 100

已编辑:所需的输出是: (空格表示空白字段)我希望我可以发布 CSV 文件。

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

DELETE,abc, ,abc,c = 书, , ,

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

INSERT,xyz,铅笔, , ,xyz, 200 20

更新, 学生, 姓名, ,a = 100, , PRATIK

【问题讨论】:

  • 发布所需的输出
  • 张贴@RomanPerekhrest
  • 我们可以有另一个字段顺序吗?
  • 是的,订单没有问题

标签: python csv dictionary


【解决方案1】:

使用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

【讨论】:

  • 所以我所要做的就是手动给一些字段名,然后对其余的进行联合。谢谢!
  • @shaikhafizunnisa,不,不是手动的。 initial_fieldnames 是您的 dict4 键的指针。因为您没有发布dict4。将initial_fieldnames 替换为您的dict4.keys()
【解决方案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

【讨论】:

  • 正是我想要的!你能解释一下 DataFrame() 中的第二个参数 columns=col 是做什么的吗?什么是 index=False。我刚开始学习 Pandas,
  • @shaikhafizunnisa 如果你print(df2),最左边会有行名,通常是0,1,2,3..。为了不写这些行名,我们设置index=False。并且参数columns=col 表示在制作此数据框时,仅使用col 列表作为数据框列中的标题。看看this
猜你喜欢
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多