我有以下代码,想要将文件中的字符串转换为字典(要读入和操作)。在下面的代码中,执行时会出现错误:“people not a defined”。我没有正确定义或语法错误吗?这是Python 3
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])
答案 0 :(得分:1)
正如您从评论中看到的那样,缩进是错误的,但我想这是来自SO上的粘贴,而不是实际代码中的问题。
但是你的代码中有两个问题。执行时print(person[0])
将失败,因为0
不是此词典的有效密钥。代码中唯一有效的密钥是username
,password
,Gender
和Career
。因此,您可以使用person
或people[items[0]]
。然后,您可以使用splitlines
来避免数据中的换行符。
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
答案 1 :(得分:1)
我不确定您对脚本的最终意图是什么,但以下内容可能会有所帮助。 Python有一个内置的CSV
模块,可以自动读取文件的每一行作为列列表。
此外,它具有CSV DictReader
变体,可能对您更有用。这将获取CSV文件中的第一行,并使用标题在读取每行时自动创建字典。
如果您的文件不包含标题行,则可以提供合适的fieldnames
列表。通过使用此功能,您无需创建字典。
以下说明如何创建people
字典。关键是每行的username
。我从username
移除person
密钥,因为它随后成为people
使用的密钥:
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'])