[英]Converting text file to list and getting at it using indexes:
任何人都可以告诉我为什么这不起作用(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()
您已经说明的错误是因为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,我们可以使用扩展的可迭代解包来获取我们想要的数据,忽略没有用户进行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
file.readlines()
返回一个行列表。
你做了: -
data = fin.readlines()
那么data
就是list
而不是string
line = data
line
也是一个list
, list
没有split
方法。
尝试type()
函数。
type(data.readlines())
list
使用您提供的数据格式(一行包含多个元组),并保留您的代码,请尝试以下操作。
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.