我目前正在尝试编写一些程序来跟踪书籍。到目前为止,该程序运行良好,它将作者的姓名存储为键,将书名存储为空字典的值。如果键已经存在,则将值附加到现有键上。我现在想做的是在再次启动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)
答案 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结构的意义。