字典在运行程序后清空

时间:2014-12-21 07:49:06

标签: python python-2.7

我正在使用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."

问题:

  1. 当我第一次“注册”时,我可以完全登录。但是,在关闭程序并再次运行之后,我无法登录。我认为这是因为我每次启动时都将字典设置为空,但它应该将内容重写到字典中。我使用Windows 7,在预览中,当我重新运行程序时,文件变空。

  2. 在我写入登录,注册或showusers后,它会打印最后一行

    “请注册,登录或查看已注册的用户。”

  3. 我请求解决方案,并提前感谢您。

    编辑:我解决了问题#2,但#1仍然存在。

3 个答案:

答案 0 :(得分:1)

对于问题1,可能是文件模式的问题。将其更改为wb+

  

打开文件,以二进制格式写入和读取。覆写   如果文件存在,则为现有文件。如果该文件不存在,   创建一个新的文件进行读写。

如果您使用if .. elif代替if

,问题2将会解决

答案 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()