2014-02-28 6 views
0

기술 개발을 위해 무의미한 추측 게임을 진행하고 있습니다. 내가 반환 값, 내부 TrueFalse 있었다 처음에는파이썬 파일 기능

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

: 나는, 그 다음이 사용자 이름이 이미 파일에 현재 여부를 확인하는 함수를 작성 파일에서 사용자와 자신의 점수를 읽을 수있는 코드를 작성하기로 결정 문제를 야기한 루프 때문에 값 대신 변수를 설정하고 그 대신 return을 사용합니다.

score.txt

는 모양과 형식 사용

user:10:50 
userB:5:10 

을하지만이 기능을 사용할 때마다 사용자가 존재하거나하지 않을 경우 userExists('nonExistingUser') 항상 어떤 아이디어는 내가 잘못 뭘하는지에 관계없이 True을 반환? 하비에르 지적 무엇을, 당신은 또한 uExists을 설정하지만,이 라인을 따라해야 usExists을 반환하고뿐만 아니라

+2

'사용자 이름'변수를 덮어 쓰고 있습니다. 지금은 – Javier

답변

0

당신의 논리는 그래서 처음에는 그 작업 (내가 올바른 오전 경우) 거의 동일해야합니다 약간 청소 업 버전을 제시, 약간 어수선하다.

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]이 무엇인지 알고 있습니다. 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() 메소드를 호출 할 필요없이 종료됩니다 것을 보장한다.

+0

이 완벽하게 작동하므로 대신 사용자 = 정보 [0]을 써야합니다. 오타를 만들었다 고 생각하시지 만, 줄 대신 줄 바꿈을 넣으시겠습니까? – user3366103

+0

좋은 눈! 고마워, 너는 내가 그 수정을 한 것을 볼 것이다. – holdenweb

+0

두 줄에 rline이 포함 된 두 줄이 있었는데 한 줄만 변경했습니다 – user3366103

0

:

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 

파이썬의 버전에 따라, 나는 또한 with statement에보고 싶은데 그걸 지우려면 f.close().

0

당신과 같이 userExists을 단순화 수 : ':'

def userExists(username): 
    with open('score.txt','rU') as score: 
     return username+':' in score.read() 

당신은 정기적 대신 + 이름의 표현 사용하실 수 있습니다 with

0

을 사용하여 파일을, 그 방법은 파일이 자동으로 닫힙니다 예외 또는 return 문을 사용하여 퇴장하더라도 with 블록을 종료 할 때 발생합니다.

def userExists(username): 
    with open('score.txt', 'rU') as f: 
     for line in f: 
      if line[:line.find(':')] == username: 
       return True 
    return False