在Python 3中定义字典

时间:2015-08-29 13:10:36

标签: python python-3.x dictionary

我有以下代码,想要将文件中的字符串转换为字典(要读入和操作)。在下面的代码中,执行时会出现错误:“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])

2 个答案:

答案 0 :(得分:1)

正如您从评论中看到的那样,缩进是错误的,但我想这是来自SO上的粘贴,而不是实际代码中的问题。

但是你的代码中有两个问题。执行时print(person[0])将失败,因为0不是此词典的有效密钥。代码中唯一有效的密钥是usernamepasswordGenderCareer。因此,您可以使用personpeople[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'])