gpt4 book ai didi

python - 尝试将 dict 写入文件时出现 KeyError [Python]

转载 作者:行者123 更新时间:2023-12-01 05:33:36 24 4
gpt4 key购买 nike

代码:

import re


def add_details(details_dict, file_mode):
with open("address.txt", file_mode) as book:
book.write("Name: {}\n".format(details_dict['Name']))
book.write("Address: {}\n".format(details_dict['Address']))
book.write("Home Phone No.: {}\n".format(details_dict['Home Phone No.']))
book.write("Mobile Phone No.: {}".format(details_dict['Mobile Phone No.']))
book.write("\n---------------\n")



def delete_person(name):
with open("address.txt", "r+") as book:
records = re.split("[-]+", book.read(), re.M)
for data in records:
record = get_record(data)
if record.get('Name', None) != name:
add_details(record, "w")


def get_record(string):
return dict(re.findall("^(.*): (.*)$", string, re.M))


def print_record(record):
print "\n"
print "Name: {}".format(record['Name'])
print "Address: {}".format(record['Address'])
print "Home Phone No.: {}".format(record['Home Phone No.'])
print "Mobile Phone No.: {}".format(record['Mobile Phone No.'])


def search_for_person(name):
with open("address.txt", "r") as book:
records = re.split("[-]+", book.read(), re.M)
for data in records:
record = get_record(data)
if record.get('Name', None) == name:
print_record(record)


choice = raw_input("Add a new person (1), delete a person(2), or search for a person(3)?\n")
if choice == "1":
details = {'Name':"", 'Address':"", 'Home Phone No.':"", 'Mobile Phone No.':""}
details['Name'] = raw_input("Enter name of contact: ")
details['Address'] = raw_input("Enter address of contact: ")
details['Home Phone No.'] = raw_input("Enter Home Telephone No. of contact: ")
details['Mobile Phone No.'] = raw_input("Enter Mobile Telephone No. of contact: ")

add_details(details, "a")

elif choice == "2":
name = raw_input("Enter name to delete: ")
delete_person(name)

elif choice == "3":
name = raw_input("Enter name: ")
print search_for_person(name)

基本上,每当我尝试使用delete_person()方法删除一个人时,我都会得到这个回溯:

Traceback (most recent call last):
File "address.py", line 56, in <module>
delete_person(name)
File "address.py", line 19, in delete_person
add_details(record, "w")
File "address.py", line 6, in add_details
book.write("Name: {}\n".format(details_dict['Name']))
KeyError: 'Name'

但是,除了该方法之外,一切都可以正常工作。考虑到我已经以完全相同的方式设置了字典,我不应该收到错误,但无论如何我都是这样。对此有什么帮助吗?如果需要的话,这是文件的布局:

Name: test
Address: testaddress
Home Phone No.: 2313123121233
Mobile Phone No.: 423423423432
---------------
Name: test2
Address: testaddress2
Home Phone No.: 342353454345
Mobile Phone No.: 231231391
---------------

最佳答案

您总是在记录后添加--------;这会导致读取记录,因为最后一行之后除了空格之外什么也没有:

>>> record='''\
... Name: test
... Address: testaddress
... Home Phone No.: 2313123121233
... Mobile Phone No.: 423423423432
... ---------------
... '''
>>> import re
>>> re.split("[-]+", record, re.M)
['Name: test\nAddress: testaddress\nHome Phone No.: 2313123121233\nMobile Phone No.: 423423423432\n', '\n']

请注意末尾的'\n' 条目。这会导致一个空字典,没有 'Name' 键:

>>> dict(re.findall("^(.*): (.*)$", '\n', re.M))
{}

测试空字典:

record = get_record(data)
if record and record.get('Name', None) == name:

关于python - 尝试将 dict 写入文件时出现 KeyError [Python],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19624187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com