使用Python读取CSV文件,然后附加到现有的密钥

时间:2018-12-18 19:39:07

标签: python csv

我目前正在尝试编写一些程序来跟踪书籍。到目前为止,该程序运行良好,它将作者的姓名存储为键,将书名存储为空字典的值。如果键已经存在,则将值附加到现有键上。我现在想做的是在再次启动Programm时从csv文件中读取行,以便Programm知道已经存在哪些键,并可以在必要时再次将其追加。

我希望我能弄清楚我要做什么。该程序仅用于学习目的,因此,如果您可以将我的正确方向指向,将不胜感激。

import csv

bücher = {}
def buch_daten():
    while True:
        autor = input("Bitte Namen des Autors eingeben! ")
        titel = input("Bitte den Titel des Buches eingeben! ")
        if autor in bücher:
            bücher[autor].append(titel)
        else:
            bücher[autor]=[titel]
        weiter = input("Noch etwas hinzufügen? (y/n)")
        if weiter == "y":
            continue
        elif weiter == "n":
            print("Danke für die Eingabe:")
            break
        else:
            print("Falsche Eingabe, dass Programm wird beendet.")
            break

def save_dict():
    with open('books2.csv', 'a', newline='') as csvfile:
        fieldnames = ['autor', 'titel']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        for key, val in bücher.items():
            writer.writerow({"autor": key, "titel": val})
    print(f"Der Autor {key} und der Titel {val} wurden der Datei hinzugefügt.")



buch_daten()
save_dict()
print(bücher)

3 个答案:

答案 0 :(得分:0)

如果您只是想保存字典以供重复使用,建议您使用pickle模块对其进行序列化:

import pickle

pickle.dump(bücher, "/path/to/write/file.pickle")

然后您可以使用load方法恢复字典以读取文件:

bücher = pickle.load("/path/to/write/file.pickle")

答案 1 :(得分:0)

代替这个

    if autor in bücher:
        bücher[autor].append(titel)
    else:
        bücher[autor]=[titel]

您可以使用setdefault(或使用defaultdict)

bücher.setdefault(autor, []).append(titel)

答案 2 :(得分:0)

我不太确定您的问题是什么,但一般的装载机将是

def load_dict():
    try:
        with open('books2.csv', 'r') as csvfile:
            for row in csv.DictReader(csvfile):
               bücher[row["autor"]] = row["titel"]
    except FileNotFoundError:
        pass

请注意FileNotFoundError异常处理,因此,如果不存在csv,则不会引发错误。然后,您可以在buch_daten

之前添加呼叫
load_dict()
buch_daten()
save_dict()

csv.DictReader返回具有字典结构的可迭代对象,因此每一行都将包含

{'autor': author_name, 'title': list_of_book_titles}

此外,您不应该附加到现有的CSV文件,而必须在其中写入:

def save_dict():
    with open('books2.csv', 'w+', newline='') as csvfile:
    […]

如果将文件追加到文件中,则只能插入新行,但这会禁止您编辑CSV本身中的作者。您可以插入重复的作者,但这会破坏CSV结构的意义。