Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python3中定义字典_Python_Python 3.x_Dictionary - Fatal编程技术网

在Python3中定义字典

在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

我有以下代码,希望将文件中的字符串转换为字典(以便读取和操作)。在下面的代码中,执行时会出现一个错误:“未定义人员”。我没有正确地定义它,还是语法错误?这是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])

正如您从注释中看到的,缩进是错误的,但我猜这是因为粘贴在这里,所以在实际代码中不是问题所在

但是,您的代码中还存在另外两个问题<代码>打印(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的缩进;问题可能与他的代码的缩进方式有关,而不是您认为应该如何缩进。