【问题标题】:Converting text file to list and getting at it using indexes:将文本文件转换为列表并使用索引获取它:
【发布时间】:2015-09-04 15:36:54
【问题描述】:

谁能告诉我为什么这不起作用(Python 3)以及我需要做些什么来修复它。下面的代码和错误信息:

def verifylogin():

fin=open("moosebook.txt","r")
data=fin.readlines()
line=data

allData = []
for ln in line.split(')('):
    allData.append( ln.lstrip('(').rstrip(')').replace("'", '').replace(' ', '').split(',') )

for data in allData:
    print (data[0]) # print user
print (data[5]) # print profession

输出错误信息:

line 30, in verifylogin
for ln in line.split(')('):

AttributeError: 'list' 对象没有属性 'split'

文本文件中的数据为:

('CoderBlogJ', 'ggs123', 'J', 'Bloggs', 'Male', 'Coder')('DoctorSmitD', 'ith123', 'D', 'Smith', 'Male', 'Doctor')('teacherminaR', 'neb123', 'R', 'minajneb', 'female', 'teacher')('WriterGardK', 'ens123', 'K', 'Gardens', 'Male', 'Writer')('', '123', '', '', '', '')('', '123', '', '', '', '')('', '123', '', '', '', '')

我希望 data[0] 和 data[5] 等打印出列表中的相关字段。

非常感谢您的回答:但是,我的最后一个任务是让用户名和密码正常工作,因为我无法翻译,所以我无法完全正常工作....

def verifylogin():
    with open("moosebook.txt") as f:
        data = literal_eval(f.read().replace(")", "),"))
    for user, pw,_,sur,_, job in data: 
        if user:
               print("{}  is a {}".format(user, pw))

     flag=0
for counter in range(0,len(data)):
    if textlogin.get()==data[counter] and textpassword.get()==data[counter+1]:
        flag=flag+1

if flag>0:
            welcome=Label(myGui,text="Access Granted. Loading Profile ....")
            welcome.pack()
else:
                denied=Label(myGui,text="Access Denied")
                denied.pack() 

【问题讨论】:

  • 行是list,您也只是使用line = data 创建对数据的引用,所以看起来多余
  • 还有follow this link :)

标签: python list file text


【解决方案1】:

您已经说明的错误是因为 line 是对作为列表的数据的引用,如果每个元组在文件中的单独行上,您可以使用 ast.literal_eval 解析数据并仅索引元组以获取你想要的数据:

from ast import literal_eval
def verifylogin():

    with open("test.csv") as f:
        for line in f:
            print(literal_eval(line))
verifylogin()

输出:

('CoderBlogJ', 'ggs123', 'J', 'Bloggs', 'Male', 'Coder')
('DoctorSmitD', 'ith123', 'D', 'Smith', 'Male', 'Doctor')
('teacherminaR', 'neb123', 'R', 'minajneb', 'female', 'teacher')
('WriterGardK', 'ens123', 'K', 'Gardens', 'Male', 'Writer')
('', '123', '', '', '', '')
('', '123', '', '', '', '')
('', '123', '', '', '', '')

如果您将所有内容放在一行中,您可以 str.replace 在每个 ) 之后添加一个逗号,这会将所有元组包装在一个元组中,以便 ast 可以正确解析文件内容:

def verifylogin():
    with open("test.csv") as f:
        data = literal_eval(f.read().replace(")", "),"))
        for t in data:
            print(t)


verifylogin()

输出将与以前相同。

如果您使用的是 python3,我们可以使用extended iterable unpacking 来获取我们想要的数据,通过 if 检查忽略没有用户的数据:

from ast import literal_eval

def verifylogin():
    with open("test.csv") as f:
        data = literal_eval(f.read().replace(")", "),"))
        for user, *rest, job in data: # python2 ->  for user, _,_,_,_, job in data:
            if user:
                   print("{}  is a {}".format(user, job))

输出:

CoderBlogJ  is a Coder
DoctorSmitD  is a Doctor
teacherminaR  is a teacher
WriterGardK  is a Writer

你可以得到任何你想要的信息,所有的数据都在循环中解包:

def verifylogin():
    with open("test.csv") as f:
        data = literal_eval(f.read().replace(")", "),"))
        for user, pw, _, _ , _, job in data:
            if user:
                print("Details for user: {}\nPassword: {}\nJob: {}\n".format(user, pw, job))

输出:

Details for user: DoctorSmitD
Password: ith123
Job: Doctor

Details for user: teacherminaR
Password: neb123
Job: teacher

Details for user: WriterGardK
Password: ens123
Job: Writer

【讨论】:

  • 加 1,打败我 :)
  • Padraic - 我不知道你是怎么做到这么快的!!!谢谢你。但是,我真的不明白代码的含义,所以无法编辑它。例如,我真正想要的是 Print: Username is: CoderBlogJ and password is: ggs123 (或以某种方式将 CoderBlogJ 的值放入 data[0] 和 ggs123 下一个存储的值,即密码放入 data[2] 以便我可以使用循环来搜索匹配项。使用上面的代码,我将如何为列表中的每个字段打印用户名:CoderBlogJ 和密码:ggs123 等等? - 这就是我想要得到的......
  • @Compoot,我添加了另一个示例,所有数据都存储在每个元组中,我们只需解压缩并使用您想要的任何一个,如果我们想要所有六个值,我们只需 for user, pw, ini, sur, sx, job in data:,您可能会发现使用 dict 更容易并将 dict 转储到文件中,使用 json 或 pickle
  • 谢谢 - 我最终要做的是阅读以检查用户名和密码检查。这就是我无法翻译成的......叹息! (已修改原代码)
  • user 是用户 pw 是密码所以if user == your_user and pw == your_password
【解决方案2】:

file.readlines() 返回行列表。

你做到了:-

data = fin.readlines()

那么datalist 而不是string

line = data

line 也是一个list,而list 没有split 方法。

试试type()函数。

 type(data.readlines())
 list

【讨论】:

  • for ln in line.split(')('): 你想在这条线上做什么?
【解决方案3】:

使用您提供的数据格式(一行包含多个元组),并保留您的代码,请尝试以下操作。

def verifylogin():
    fin = open("moosebook.txt", "r")
    data = fin.readlines()

    allData = []
    for line in data:
            for ln in line.split(')('):
                allData.append(ln.lstrip('(').rstrip(')').replace("'", '').replace(' ', '').split(','))

    for data in allData:
        print(data[0])  # print user
        print(data[5])  # print profession

verifylogin()

【讨论】:

    猜你喜欢
    • 2013-06-12
    • 2017-06-30
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2023-03-10
    相关资源
    最近更新 更多