我正在做一个毫无意义的技能开发猜谜游戏。我决定编写代码从文件中读取用户和他们的分数,然后编写一个函数来检查当前文件中是否已经有用户名:
import getpass
user = getpass.getuser()
def userExists(username):
f = open('score.txt', 'rU')
for line in f:
row = line.split('\r\n')
info = row[0].strip('\r\n').split(':')
username = info[0]
if user==username:
uExists = True
break
else:
uExists = False
return usExists
f.close()首先,我有返回值,True和False在循环中,这会导致问题,所以我将一个变量设置为值和return。
score.txt看起来类似于并使用了以下格式:
user:10:50
userB:5:10但是,每当我使用这个函数userExists('nonExistingUser')时,它总是返回True,不管用户是否存在,我做错了什么?
发布于 2014-02-28 18:55:21
您的逻辑有点混乱,所以首先我介绍一个稍微清理过的版本,它的操作应该(如果我是正确的)几乎是一样的。
import getpass
user = getpass.getuser()
def userExists(username):
f = open('score.txt', 'rU')
for line in f:
username = line.rstrip().split(':')[0]
if user==username:
return True
return False
f.close()rstrip()方法调用返回相同的字符串,没有任何尾随空格;split()调用返回由冒号分隔的三个字符串的列表,您已经知道[0] does.The uexists标志是不必要的。我以为你想去掉行尾的所有空白?
这确实存在一个不幸的问题,即文件从未关闭(建议的代码也是如此)。一个相对容易(但相当高级)的修复方法是将该文件用作上下文管理器。
import getpass
user = getpass.getuser()
def userExists(username):
with open('score.txt', 'rU') as f:
for line in f:
username = line.rstrip().split(':')[0]
if user==username:
return True
return False这可以确保无论函数如何返回,文件都将正确关闭,而不需要显式调用其close()方法。
发布于 2014-02-28 18:47:42
除了JAvier指出的内容外,您还设置了uExists,但返回usExists应该遵循以下思路:
def userExists(username):
f = open('score.txt', 'rU')
uExists = False
for line in f:
row = line.split('\r\n')
info = row[0].strip('\r\n').split(':')
if user==info[0]:
uExists = True
break
else:
uExists = False
f.close()
return uExists根据您版本的python,我还将查看带语句以清理该f.close()。
发布于 2014-02-28 18:52:06
您可以这样简化userExists:
def userExists(username):
with open('score.txt','rU') as score:
return username+':' in score.read()您可能希望使用正则表达式而不是用户名+‘:’。
https://stackoverflow.com/questions/22103227
复制相似问题