首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python文件函数

Python文件函数
EN

Stack Overflow用户
提问于 2014-02-28 18:39:07
回答 4查看 114关注 0票数 0

我正在做一个毫无意义的技能开发猜谜游戏。我决定编写代码从文件中读取用户和他们的分数,然后编写一个函数来检查当前文件中是否已经有用户名:

代码语言:javascript
复制
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()

首先,我有返回值,TrueFalse在循环中,这会导致问题,所以我将一个变量设置为值和return

score.txt看起来类似于并使用了以下格式:

代码语言:javascript
复制
user:10:50
userB:5:10

但是,每当我使用这个函数userExists('nonExistingUser')时,它总是返回True,不管用户是否存在,我做错了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-28 18:55:21

您的逻辑有点混乱,所以首先我介绍一个稍微清理过的版本,它的操作应该(如果我是正确的)几乎是一样的。

代码语言:javascript
复制
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标志是不必要的。我以为你想去掉行尾的所有空白?

这确实存在一个不幸的问题,即文件从未关闭(建议的代码也是如此)。一个相对容易(但相当高级)的修复方法是将该文件用作上下文管理器。

代码语言:javascript
复制
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()方法。

票数 0
EN

Stack Overflow用户

发布于 2014-02-28 18:47:42

除了JAvier指出的内容外,您还设置了uExists,但返回usExists应该遵循以下思路:

代码语言:javascript
复制
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()

票数 0
EN

Stack Overflow用户

发布于 2014-02-28 18:52:06

您可以这样简化userExists:

代码语言:javascript
复制
def userExists(username):
    with open('score.txt','rU') as score:
        return username+':' in score.read()

您可能希望使用正则表达式而不是用户名+‘:’。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22103227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档