2014-07-14 3 views
0

내 프로그램은 다양한 유형의 로그 파일을 구문 분석하고 일부는 파일 시작 부분에 빈 줄을 포함합니다. 첫 번째 줄에 대한 변수를 얻는 것은이 프로그램에서 매우 중요합니다. 빈 줄을 건너 뛰는 방법을 알아 냈습니다. 그러나 첫 줄을 실제 줄과 같이 처리하도록 만들지 못했습니다. 내가 first_line 파일의 두 번째 줄을 = 만드는 다른 문을 필요 readline을 사용하여 파이썬에서 파일을 읽을 때 공백 행 건너 뛰기

if first_line.find('Chain') != -1: 
    first_time = int(searchforfirsttime.group(2) 

내 후 다음과 같이 내 코드입니다. 감사합니다. .

편집 : 내가 읽고있다 파일의

처음 몇 줄은

(Blank Line) 
CODE: 30; Chain 1; Time = 92473622; PASSIVE:; 127; 127; 127; 127; ACTIVE:; 127; 127; 127; 127; 127; 127; 127; 127; 127; 127; CAPS:; 0; 0; 0; 0; 0; 0; 0; 0; 0; DELAYS:; 0; 0; 0; 0; 
CODE:31; Chain1:; Time = 92473765; DCInputPower = -28.587273; DCOutputPower = -23.745722; DCCoeffs: I:0; Q:0I:0; Q:0I:0; Q:0I:0; 
+0

당신이 우리에게 파일의 처음 몇 줄을 줄 수 있습니까? – Hoopdady

+0

첫 줄을 어떻게 얻었습니까? 대부분의 경우, 똑같은 코드가 두 번째 링크를 가져 와서 'first_line'에 넣을 것이라고 생각합니다. 주요 문제에 관련없는 – TheSoundDefense

+0

, 나는'교체 건의 경우 first_line.find ('체인') = -1 :!'first_line에서 '만약'체인 '와' –

답변

2

애니 쉬 샤 제안은 좋은 대답 있다 파일을 메모리에 맞게 수정하십시오 (편집 : 이제는 두 가지 경우 모두 훌륭한 답변을 얻을 수 있습니다). 그럴 수 없다면 while 루프를 사용하여 첫 번째 줄을 찾고 first_time을 할당 할 때까지 계속 루프를 반복 할 수 있습니다.

first_time = None 
while first_time is None: 
    first_line = file.readline() 
    if first_line.find('Chain') != -1: 
    first_time = int(searchforfirsttime.group(2)) 

나는 첫 번째 줄을 얻기 위해 readline()을 사용한다고 가정합니다.

이것은 내가 파이썬에 대해 좋아하는 한 가지는 동적 입력입니다. first_time은 무엇이든 될 수 있으므로 실제로는 int()이 반환하지 않는 값부터 시작할 수 있습니다. 그것은 우리가 일할 때까지 떠나지 않는다는 것을 보장합니다.

+0

이제 PEP 8의 [프로그래밍 권장 사항] (http://legacy.python.org/dev/peps/pep-0008/#programming-recommendations)에서 "None과 같은 싱글 톤과의 비교 항상'is' 또는'is not'로 처리되어야합니다. 결코 평등 연산자가 아닙니다. 따라서'first_time == None'을'first_time is None'으로 대체하십시오. –

+0

@CristianCiupitu와 공정한 nitpick이었다. 답변이 변경되었습니다. – TheSoundDefense

3
lines = filter(None, (line.rstrip() for line in open(logfile))) 

이 당신에게 파일의 비어 있지 않은 모든 라인의 목록을 제공합니다.

UPDATE : 당신은 메모리 제약 조건가 발생하는 경우

, 당신은 대신 목록의 발전기를 반환 itertools.ifilter 사용할 수 있습니다 - 당신이 할 수있는 경우 CristianCiupit

+1

[TheSoundDefense] (http://stackoverflow.com/a/24743575/12892)가 메모리 사용에 대해 불평하는 것을 막으려면 생성기 기반 솔루션을 추가하는 것이 좋습니다. 하나는 ['itertools.ifilter'] (https://docs.python.org/2/library/itertools.html#itertools.ifilter) 또는 생성자 이해력을 사용합니다. –

+0

@CristianCiupitu 예! 하하. 나는 대답에 그것을 추가하려고했습니다. 나는 전에 기억을 생각하지 않았다. 감사! –

+0

@CristianCiupitu하지만 메모리 사용에 대해 불평하는 것 ... 어떤 경우에도 비어 있지 않은 라인 생성기를 만드는 것이 가장 좋은 해결책 일 것입니다. 다른 부분을 거의 변경하지 않고 기존 코드에 바로 연결할 수 있습니다. – TheSoundDefense

0

당신은 ASCII 텍스트 파일을 구문 분석하는 경우, 다음을 수행 할 수 있어야한다 :

LogFilePathNameString = '/path/to/log/file/LogFileName.log'; 

FirstLineString = ''; 
FirstLineIndex = 0; 

with open(LogFilePathNameString, 'r') as LogFileObject: 

    LogFileObjectLineStringsList = LogFileObject.readlines(); 

    NumFileLines = len(LogFileObjectLineStringsList); 

    for i in range(0, NumFileLines, 1): 

     CurrentLineString = LogFileObjectLineStringsList[ i ]; 

     if (CurrentLine != '\n'): 

      FirstLineString = CurrentLineString; 
      FirstLineIndex = i; 
      break; 

     #fi 

    #rof 

#hitw 

print ('Found ' + str(FirstLineString) + ' on Line ' + str(FirstLineIndex) '.'); 
+0

일부 빈 줄과'# end-of-block '주석을 지우지 않아도됩니다. 나는. 코드를 더 Python으로 만들고 [PEP 8] (http://legacy.python.org/dev/peps/pep-0008/)을 준수하십시오. –

관련 문제