在没有键的循环中使用 dict 值更新 csv

Update a csv with dict values in a loop without keys

我可以使用 csv.Dictwriter 从 dict 生成 csv,但无法弄清楚如何制作一个函数来将新的 dicts 值附加到 csv 文件并确保将值添加到正确的csv 的列以保留键和值之间的 link。

[添加以阐明为什么我在循环中需要它]在我编写的代码中,我需要将 headers 写入 csv,然后我有一个测量循环,在循环中我收到一个 dict所有的测量结果,并想将其写入 csv 文件——然后当循环的下一次迭代发生时,dict 将被重写为新值——我只是不知道如何编写一些代码来模拟没有我去的 dict 的 dict与.

代码

import csv
print('\n'*3)

adict = {"Gizmo" : 1, "Line" : 1, "Height" : 6.0, "Weight" : 9.7, "Width" : 90}
bdict = {"Gizmo" : 1, "Line" : 2, "Height" : 5.8, "Weight" : 9.9, "Width" : 89.2}
cdict = {"Gizmo" : 1, "Line" : 3, "Height" : 6.3, "Weight" : 11.0, "Width" : 91.9}
ddict = {"Gizmo" : 1, "Line" : 4, "Height" : 6.2, "Weight" : 7.7, "Width" : 89.4}
my_dict = {"a": adict, "b": bdict, "c" : cdict, "d" : ddict}

def make_csv_with_headers(my_csv_file):
    csv_file = my_csv_file
    try:
        with open(csv_file, 'w') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames = my_dict["a"].keys())
            writer.writeheader()
            #for data in adict:
                #writer.writerow(data)
    except IOError:
        print("I/O error")


def update_csv(my_csv_file):
    csv_file = my_csv_file
    with open(csv_file, 'w') as csvfile:
        writer = csv.DictWriter(csvfile)
        for k, v in adict.items():
            writer.writerow(v)


make_csv_with_headers("a_data.csv")
for k,v in my_dict.items():
    print(v,'\n')
    update_csv("a_data.csv")

尝试过但失败了

def update_csv_2():
    myfile = open('aa.csv', 'w')

    with open(myfile, 'w') as f:   
        fnames = my_dict["a"].keys()
        writer = csv.DictWriter(f, fieldnames=fnames)    
        writer.writeheader()
        writer.writerow(my_dict["a"].values())
        writer.writerow(my_dict["b"].values())
        writer.writerow(my_dict["c"].values())
        writer.writerow(my_dict["d"].values())

期望的输出#csv文件

Gizmo,Line,Height,Weight,Width
1,1,6.0,9.7,90
1,2,5.8,9.9,89.2
1,3,6.3,11.0,91.9
1,4,6,2,7.7,89.4

当你必须在循环中使用它时的代码

import csv
from csv import writer
from csv import DictWriter

adict = {"Gizmo" : 1, "Line" : 1, "Height" : 6.0, "Weight" : 9.7, "Width" : 90}
bdict = {"Gizmo" : 1, "Line" : 2, "Height" : 5.8, "Weight" : 9.9, "Width" : 89.2}
cdict = {"Gizmo" : 1, "Line" : 3, "Height" : 6.3, "Weight" : 11.0, "Width" : 91.9}
ddict = {"Gizmo" : 1, "Line" : 4, "Height" : 6.2, "Weight" : 7.7, "Width" : 89.4}
my_dict = {"a": adict, "b": bdict, "c" : cdict, "d" : ddict}
my_dict2 = [adict,bdict,cdict,ddict]


def make_csv_with_header(filename):
    headers = ["Gizmo", "Line", "Height", "Weight", "Width"]
    with open(filename, 'w') as f:
            writer_object = writer(f)
            writer_object.writerow(headers)
            f.close()


def append_csv(filename, mydict): 
    field_names = ["Gizmo", "Line", "Height", "Weight", "Width"] 
    # Open your CSV file in append mode, Create a file object for this file
    with open('a3.csv', 'a') as f_object: 
        # Pass the file object and a list  of column names to DictWriter() You will get a object of DictWriter
        dictwriter_object = DictWriter(f_object, fieldnames=field_names)
        #Pass the dictionary as an argument to the Writerow()
        dictwriter_object.writerow(mydict)
        #Close the file object
        f_object.close()


# make initial csv with headers
make_csv_with_header("a3.csv")
# appending dict to csv
for dicty in my_dict2:
    append_csv("a3.csv", dicty)

您不想重复打开和关闭 .csv 文件。特别是如果你以 w 模式打开,旧的内容就会消失。只需打开一次:

import csv
print('\n'*3)

adict = {"Gizmo" : 1, "Line" : 1, "Height" : 6.0, "Weight" : 9.7, "Width" : 90}
bdict = {"Gizmo" : 1, "Line" : 2, "Height" : 5.8, "Weight" : 9.9, "Width" : 89.2}
cdict = {"Gizmo" : 1, "Line" : 3, "Height" : 6.3, "Weight" : 11.0, "Width" : 91.9}
ddict = {"Gizmo" : 1, "Line" : 4, "Height" : 6.2, "Weight" : 7.7, "Width" : 89.4}
my_dict = {"a": adict, "b": bdict, "c" : cdict, "d" : ddict}


with open("a_data.csv", 'w') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames = my_dict["a"].keys())
    for k, v in my_dict.items():
        print(v, '\n')
        writer.writerow(v)

如果您没有立即写入所有值,请使用相同的模式:


with open("a_data.csv", 'w') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames = my_dict["a"].keys())
    while True:
        measurements = do_measurement()
        writer.writerow(measurements)

不需要my_dict