从文件读取和模拟数据库

时间:2014-05-20 23:07:19

标签: python file parsing file-io dictionary

这是我想要做的: 我已经建立了一个迷你系统,允许用户注册和等等,但系统非常依赖db_parse()user_exists(),因为这是整个脚本运行的两个主要条件。

基本上我正在测试用户是否存在user_exists('username'),该用户应返回“True”(这是一个值为True / False的dict)。

所以,这是整个代码(请原谅我们的压力:

class __system():
    def __init__(self):
        self.usernames = []
        self.passwords = []
        self.dbname = 'database.txt'
        self.privilege = [1,2,3]
        self.backupdb = 'backup.txt'

    def db_parse(self):
        d = {'username':[],
             'uid':[],
             'password':[],
             'pwdid':[]
             }
        with open(self.dbname,'r') as f:
            lines = ([line.rstrip() for line in f])
            f.flush()
            for x in xrange(0,len(lines)):
                if x%2==0:
                    d['username'].append(lines[x])
                    d['uid'].append(x) #-> number of line in the file
                if x%2==1:
                    d['password'].append(lines[x])
                    d['pwdid'].append(x)
            print lines
            f.close()
        return d

    def user_exists(self, username=''):
        d = {'exists': None,
             'uid': None
        }
        db = self.db_parse()
        ylen = len(db['username'])

        for y in range(0,ylen):
            if username == db['username'][y]:
                d['exists'] = True
                d['uid'] = db['uid'][y]

            else:
                d['exists'] = False
                d['uid'] = None
        return d

def main():
    obj = __system()
    print obj.user_exists('user1')

if __name__ == "__main__":
    main()

'database.txt'看起来像这样:

user1<br>
203ad5ffa1d7c650ad681fdff3965cd2<br>
user2<br>
6e809cbda0732ac4845916a59016f954<br>

我怎么能这样说...这有时可行,这不行,我已经连续10个小时调试了(是的,没错。) 我似乎无法理解为什么当用户明显存在时返回“False”和"uid:0"然后,5分钟后,只重新粘贴代码,它确实有效。

1 个答案:

答案 0 :(得分:0)

你会为此而踢自己,但问题在于:

    for y in range(0,ylen):
        if username == db['username'][y]:
            d['exists'] = True
            d['uid'] = db['uid'][y]

        else:
            d['exists'] = False
            d['uid'] = None
    return d

如果username与文件中的第一个用户匹配,则for循环将继续传输到文件中的第二个用户,当然,这个用户不会匹配。所以它最终返回False / None。如果找到匹配项,您只需添加break

    for y in range(0,ylen):
        if username == db['username'][y]:
            d['exists'] = True
            d['uid'] = db['uid'][y]
            break  # Add this
        else:
            d['exists'] = False
            d['uid'] = None
    return d

另外,如果您使用f.close()打开文件,则无需致电with open(...) as f。离开with块时,文件将自动关闭。您还应该使用for x, line in enumerate(lines):代替for x in xrange(0, len(lines)):