在Python3中定义字典
我有以下代码,希望将文件中的字符串转换为字典(以便读取和操作)。在下面的代码中,执行时会出现一个错误:“未定义人员”。我没有正确地定义它,还是语法错误?这是Python 3在Python3中定义字典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有以下代码,希望将文件中的字符串转换为字典(以便读取和操作)。在下面的代码中,执行时会出现一个错误:“未定义人员”。我没有正确地定义它,还是语法错误?这是Python 3 def verifylogin(): people={} with open("moosebook.txt","r") as f: for line in f: items=line.split(",") person={} person['username'] =items[0] perso
def verifylogin():
people={}
with open("moosebook.txt","r") as f:
for line in f:
items=line.split(",")
person={}
person['username'] =items[0]
person['password']=items[1]
person['Gender']=items[2]
person['Career']=items[3]
people[items[0]]=person
print(person[0])
正如您从注释中看到的,缩进是错误的,但我猜这是因为粘贴在这里,所以在实际代码中不是问题所在 但是,您的代码中还存在另外两个问题<代码>打印(person[0])在执行时将失败,因为
0
不是此处词典的有效键。代码中唯一有效的密钥是用户名
、密码
、性别
和职业
。因此,您可以使用person
或people[items[0]]
。然后您可以使用拆分行
来避免数据中出现换行
def verifylogin():
people = {}
with open("moosebook.txt", "r") as f:
for line in f.read().splitlines(): # Fixed line
items = line.split(",")
person = {}
person['username'] = items[0]
person['password'] = items[1]
person['Gender'] = items[2]
person['Career'] = items[3]
people[items[0]] = person
print(people[items[0]]) # Fixed line
我不确定您的脚本的最终目的是什么,但下面的内容可能会有所帮助。Python有一个内置的
CSV
模块,可以自动将文件中的每一行作为列列表读取
此外,它还有一个CSV变体,可能对您更有用。这将获取CSV文件中的第一行,并在读入每一行时使用标题为其自动创建字典
如果文件不包含标题行,则可以提供合适的字段名列表。通过使用此功能,您无需创建字典
下面向您展示了如何创建people
字典。键是每行的用户名
。我从person
中删除username
键,因为它随后成为人使用的键:
import csv
def verifylogin():
people = {}
with open("moosebook.txt","r") as f:
for person in csv.DictReader(f):
print("Person: ", person)
username = person['username']
del person['username']
people[username] = person
print("People:", people)
print("Wilma's career:", people['Wilma']['Career'])
verifylogin()
因此,如果moosebook.txt
包含以下条目:
username,password,Gender,Career
Fred,Password1,Male,Builder
Wilma,Password2,Female,Teacher
您将看到以下输出:
Person: {'Career': 'Builder', 'password': 'Password1', 'username': 'Fred', 'Gender': 'Male'}
Person: {'Career': 'Teacher', 'password': 'Password2', 'username': 'Wilma', 'Gender': 'Female'}
People: {'Wilma': {'Career': 'Teacher', 'password': 'Password2', 'Gender': 'Female'}, 'Fred': {'Career': 'Builder', 'password': 'Password1', 'Gender': 'Male'}}
Wilma's career: Teacher
如果文件没有标题行,则可以更改以下行:
csv_input = csv.DictReader(f, fieldnames=['username', 'password', 'Gender', 'Career'])
你的压痕全错了;您的错误很可能是由不正确的缩进引起的,因此请务必确保问题中的缩进准确反映了您的代码。我认为您正面临缩进问题。顺便问一下,您在哪里使用《人物词典》?另外,请包括错误的完整回溯,而不仅仅是部分异常消息。大概不仅仅是没有定义人员
@user3100115:请不要在这里修复缩进,因为这很可能是错误背后的问题。@user3100115不要尝试修复Compoot的缩进;问题可能与他的代码的缩进方式有关,而不是您认为应该如何缩进。