2015-01-24 7 views
-2

passwd와 dictionary라는 두 개의 파일이 있습니다. passwd는 한 단어의 테스트 파일이지만 사전에는 몇 줄의 단어 목록이 있습니다. 내 프로그램은 지금까지 읽고 사전 파일의 첫 번째 줄만 비교합니다. 예를 들어. 내 사전 파일에 계란, 생선, 빨강, 파랑이 들어 있습니다. 내 passwd 파일에는 (egg) 만 포함되어 있습니다.어떻게 파이썬 프로그램이 파일에서 라인을 읽게 할 수 있습니까?

프로그램은 정상적으로 실행되지만 사전에 단어 egg를 전환하면 목록에서 마지막으로 말할 수 있습니다. 프로그램은 그것을 읽지 않고 결과를 끌어 올리지 않습니다.

내 코드는 다음과 같습니다.

#!/usr/bin/passwd 

import crypt 

def testPass(line): 
    e = crypt.crypt(line,"HX") 
    print e 

def main(): 
    dictionary = open('dictionary', 'r') 
    password = open('passwd', 'r') 
    for line in dictionary: 
     for line2 in password: 
      if line == line2: 
       testPass(line2) 
    dictionary.close() 
    password.close() 

main() 
+1

은 #!/usr/bin/passwd shebang입니까? – Jasper

+0

오른쪽을 살펴보면 "관련 질문"섹션이 보입니다. 그 질문에는 당신이 이미 찾고있는 해답이 있습니다. – LukeP

+0

아니요, 지적 해 주셔서 고맙습니다. – Onlytito

답변

1

당신이 암시 적으로 각각의 호출로 파일 포인터를 전진 파일의 readline 방법을 사용

for line in file_obj: 
    .... 

을합니다. 즉, 내부 루프가 처음 수행 된 후에는 더 이상 읽을 행이 없으므로 더 이상 실행되지 않습니다.

하나의 가능한 해결책은 readlines을 사용하여 메모리에 하나의 파일을 보관하는 것입니다. 이렇게하면 다른 파일에서 읽은 각 행에 대해 반복 할 수 있습니다.

file_as_list = file_obj.readlines() 
for line in file_obj_2: 
    for line in file_as_list: 
    .. 
+0

당신의 영혼은 일했습니다 !!!! .readlines()를 코드 줄에 추가하는 것만 큼 간단합니다! – Onlytito

0

일단 내부 루프가 한 번 실행되면 암호 파일의 끝에 도달하게됩니다. 외부 루프가 두 번째 반복을 수행하면 파일 포인터를 파일의 시작 부분으로 다시 이동시키지 않아 패스워드 파일을 읽을 수있는 부분이 남아 있습니다.

문제에는 여러 가지 해결책이 있습니다. seek을 사용하여 파일 포인터를 처음으로 다시 이동할 수 있습니다. 또는 전체 암호 파일을 한 번 읽고 데이터를 목록에 저장할 수 있습니다. 또는 외부 루프 반복마다 파일을 다시 열 수 있습니다. 어떤 것이 가장 적합한지는 데이터의 성격 (느린 네트워크 공유 또는 고속 로컬 디스크에 얼마나 많은 행이 있는지)과 성능 요구 사항이 무엇인지에 따라 다릅니다.