2017-10-06 4 views
-3

을 file.txt를 위해 sys.argv에에서 비교에 대해 : 모두가 잘 작동하지만, 단지내 코드에 문제가

for hosts in s: 
    for line in fin: 
     if hosts==line: 
      print line 

이 dosn't 작업을 비교하고에 출력하지 아무것도하지 않고입니다 cmd.

import os.path 
import sys 
'''////if not enouth suffix in the code////''' 
if len(sys.argv)<2: 
    print "Please write %s <FileLocation> <hostname1> <hostname2> " % sys.argv[0] 
    sys.exit(1) 

'''////check if the file is exist in the dir////''' 
filelocation = sys.argv[1] 
if os.path.exists(filelocation) == False: 
    print "File dosnt exist please write after %s <exist file> " % sys.argv[0] 
    sys.exit(1) 

'''////compare from the sys.argv to the file////''' 
with open(filelocation,"r") as fin: 
    s = set(sys.argv[2:]) 
    for hosts in s: 
     for line in fin: 
      if hosts==line: 
       print line 
+0

각 if 앞에 '값 2. 호스트와 행의 유형을 인쇄하십시오. 그것은 아마도 비교 문제 일 것입니다. – Neo

+0

나는 그 (것)들을 전에 인쇄하고 그것의 일 잘 잘 문제는 안으로다는 것을 나가 생각하는 경우에 – user8730632

+0

당신에게 들여 쓰기를 고치십시오. –

답변

-1

당신은 with 블록 이후에 추가로 들여 쓰기를 할 필요가있다. 그렇지 않은 경우 finNone입니다. 그래서, 당신의 코드는 다음과 같이 표시됩니다

with open(filelocation,"r") as fin: 
    s = set(sys.argv[2:]) 
    for hosts in s: 
     for line in fin: 
      if hosts==line: 
       print line 
+0

이 코드는 내가 작성한 코드와 같습니다. – user8730632

+0

@ user8730632 처음에는 들여 쓰기 문제가 있었으므로 들여 쓰기가있는 코드에서 실수라고 생각했습니다. 당신에게 도움이되었거나 여전히 같은 문제가 있습니까? –

+0

@ user8730632 오랜 시간 (수 시간) 문제를 해결할 수없는 경우. 아마도 여러분이 전에 시도 할 수있는 것은 :'host'와'line'과 그 길이를 모두 출력한다면. 작동하지 않으면'for' 루프가 전혀 실행되지 않는지 확인해야합니다. 나는 당신에게 잘 맞는 대답이 없다면 더 나아 가기 위해 몇 가지 추가 조치를 취할 필요가 있다고 생각합니다. 어쩌면 당신은 현재의 뿌리 인 또 다른 문제를 접하게 될 것입니다. –

0

문제는 line 텍스트 파일에서 줄 끝에 줄 바꿈 (\n)가 포함되어 있다는 점이다.

str.strip()을 사용하여 제거하십시오.

with open(filelocation,"r") as fin: 
    s = set(sys.argv[2:]) 
    for host in s: 
     for line in fin: 
      if host==line.strip(): 
       print line 
+0

그게 나를 위해 작동하지 않습니다 – user8730632

+0

@ user8730632 어떤면에서는 작동하지 않습니까? – Neo

0

첫 번째 문제 : 파일의 내용에서 공백과 개행 문자를 제거해야합니다. 두 번째 문제 : 첫 번째 문제가 해결되면 내부 루프가 첫 번째 외부 루프에 대해서만 실행된다는 것을 알 수 있습니다. 첫 번째 외부 루프 이후에 파일의 끝에 도달 했으므로 반복 할 항목이 없기 때문입니다 .

파일이 정말 큰 경우를 제외하고, 가장 좋은 방법은, 먼저에게 집합을 교차 얻기 위해 일련의 작업을 사용하는 것입니다 : 당신은 당신이 반전 할 것이다 큰 파일을 기대한다면

s1 = set(sys.argv[2:]) 
with open(filelocation) as fin: 
    s2 = set(filter(None, (line.strip() for line in fin))) 
print "\n".join(s1 & s2) 

을 루프 :이 파일을 소진하고, 또한 세트 조회로 더 효율적입니다 피한다

s = set(sys.argv[2:]) 
with open(filelocation) as fin: 
    for line in fin: 
     line = line.strip() 
     if line in s: 
      print line 

는 (현재의 알고리즘을 대신 O의 (N)) O (1)이다.

+0

이것은 dsnt work입니다 ... 제 코드와 두 번째 코드 모두에서 제 코드를 편집하려고 시도합니다. – user8730632

+0

과이 줄을 쓸 때s2 = set (필터 (없음, 줄. 핀 라인)) 출시에 의 표시 나 오류 스트립() 그 날이 오류를 말해 다음과 같은 경우 발전기 식을 괄호로해야하지 유일한 인수 – user8730632

+0

그래서 당신이 마지막 문제를 해결하기 위해 무엇을 했는가? 오류 메시지는 분명합니다 ... 이전 의견에 대해 "작동하지 않습니다"는 가장 유용하지 않은 보고서입니다. 더 많은 도움을 얻으려면 유용한 코드, 데이터 세트 및 전체 추적 정보를 게시해야합니다. –

관련 문제