我正在使用python 2.7.5并且我正在尝试创建一个具有用户名,密码的简单程序,并检查它是否存在于字典中。如果为true,则打印welcome + username,如果为false则忽略。 第一:代码。
#!/usr/bin/python
import csv
users = {}
with open('C:\\Users\\chef\\Python\\fn.csv', 'wb') as f: # Just use 'w' mode in 3.x
w = csv.DictWriter(f, users.keys())
w.writeheader()
w.writerow(users)
def new_user():
uname = raw_input("Choose a username: ")
while 1:
pwd = raw_input("Choose a password: ")
check = raw_input("Retype password: ")
if pwd == check:
print "Saved."
users[uname] = pwd
break
if uname in users.keys():
pass
def show_users():
for unames in users.keys():
print unames
def login():
uname = raw_input("Username: ")
pwd = raw_input("Password: ")
if uname in users and pwd in users.values():
print "Welcome, " + uname + "! "
def save():
f=open('C:\\Users\\chef\\Python\\fn.csv', "wb")
w = csv.writer(f)
for key, val in users.items():
w.writerow([key, val])
f.close()
def read():
with open('C:\\Users\\chef\\Python\\fn.csv', 'wb') as f: # Just use 'w' mode in 3.x
w = csv.DictWriter(f, users.keys())
w.writeheader()
w.writerow(users)
print "Welcome to Yubin's 'fake' Email server."
while 1:
read()
choice = raw_input("What would you like to do? ")
if choice == "signup":
new_user()
if choice == "login":
login()
if choice == "showusers":
show_users()
if choice == "logout":
print "You have successfully logged out."
if choice == "quit":
x = raw_input("Are you sure? (y/n) ")
if x == "y":
save()
break
else:
pass
else:
print "Please sign up, log in or see who have signed up."
问题:
当我第一次“注册”时,我可以完全登录。但是,在关闭程序并再次运行之后,我无法登录。我认为这是因为我每次启动时都将字典设置为空,但它应该将内容重写到字典中。我使用Windows 7,在预览中,当我重新运行程序时,文件变空。
在我写入登录,注册或showusers后,它会打印最后一行
“请注册,登录或查看已注册的用户。”
我请求解决方案,并提前感谢您。
编辑:我解决了问题#2,但#1仍然存在。
答案 0 :(得分:1)
对于问题1,可能是文件模式的问题。将其更改为wb+
打开文件,以二进制格式写入和读取。覆写 如果文件存在,则为现有文件。如果该文件不存在, 创建一个新的文件进行读写。
如果您使用if
.. elif
代替if
答案 1 :(得分:1)
问题是,正如hyades所说,你的读取方法会覆盖csv文件而不是读取它。 csv-module为此提供了一个阅读器。我已经改变了你的读取方法,使它工作:
def read():
with open('C:\\Users\\chef\\Python\\fn.csv', 'r') as f:
usersReader = csv.reader(f)
for row in usersReader:
if row == []:
pass
else:
users[row[0]] = row[1]
f.close();
您还可以在文件开头删除“with open ...” - 代码块(在导入和用户声明之后)。
答案 2 :(得分:0)
检查上面的代码。我只使用保存和读取功能。我只使用了read函数一次,在while循环之外(使用'rb'模式istaed'wb'模式)。我使用了csv.WriteDict和csv.ReadDict类enter link description here。从用户dict读取和保存数据。我认为你可以使用shelve或json而不是csv,这些方式会更快更简单地使用;)
#!/usr/bin/python
import csv
users = {}
'''def write():
with open('/home/marcin/fn.csv', 'wb+') as f: # Just use 'w' mode in 3.x
w = csv.DictWriter(f, users.keys())
w.writeheader()
w.writerow(users)'''
def new_user():
uname = raw_input("Choose a username: ")
while 1:
pwd = raw_input("Choose a password: ")
check = raw_input("Retype password: ")
if pwd == check:
print "Saved."
users[uname] = pwd
break
if uname in users.keys():
pass
def show_users():
for unames in users.keys():
print unames
def login():
uname = raw_input("Username: ")
pwd = raw_input("Password: ")
if uname in users and pwd in users.values():
print "Welcome, " + uname + "! "
def save():
with open('/home/marcin/fn.csv', "wb+") as f:
fieldnames=['user','pwd']
writer = csv.DictWriter(f,fieldnames=fieldnames)
writer.writeheader()
for key, val in users.items():
writer.writerow({'user' : key, 'pwd' : val})
def read():
with open('/home/marcin/fn.csv','rb') as f: # Just use 'w' mode in 3.x
w = csv.DictReader(f)
for row in w:
print row
users[row['user']]=row['pwd']
def main():
print "Welcome to Yubin's 'fake' Email server."
try:
read()
except IOError:
pass
while 1:
choice = raw_input("What would you like to do? ")
if choice == "signup":
new_user()
save()
if choice == "login":
login()
if choice == "showusers":
show_users()
if choice == "logout":
print "You have successfully logged out."
if choice == "quit":
x = raw_input("Are you sure? (y/n) ")
if x == "y":
save()
break
else:
pass
else:
print "Please sign up, log in or see who have signed up."
if __name__ == "__main__":
main()