2012-09-06 6 views
2

이 게시물이 길 경우 사과하지만되도록 자세하게 설명하려고합니다. 필자는 주제에 대해 상당한 양의 연구를 수행했으며 "중급"숙련 된 프로그래머라고 생각할 것입니다.파이썬 : 텍스트 파일에서 여러 줄의 서식을 다시 지정

내 문제 : 여러 줄의 데이터가있는 텍스트 파일이 있습니다. 관련없는 정보를 없애기 위해 각 줄의 특정 부분을 제거한 다음 새로 형식이 지정된 줄로 파일을 저장하고 싶습니다.

다음은 내가 성취하고자하는 목표의 예입니다. 내가 코드를 가지고 노력하고 텍스트 파일을 읽고, 출력하고

access-list inbound_outside1 line 165 extended permit tcp any host 209.143.156.200 eq www (hitcnt=10086645) 0x3eb90594 

:

permit tcp any 209.143.156.200 www 

다음 코드는 작동하지만, 단일 라인이있는 경우에만 원래 라인은 뭔가처럼 텍스트 파일 :

: 나는 데이터의 여러 줄의 전체 파일이 실행을 시도 때

input_file = open("ConfigInput.txt", "r") 
output_file = open("ConfigOutput.txt", "w") 

for line in input_file: 
    line = line.split("extended ", 1)[1] 
    line = line.split("(", 1)[0] 
    line = line.replace(" host", "") 
    line = line.replace(" eq", "") 
    output_file.write(line) 

output_file.close() 
input_file.close() 

는, 나는 오류가 발생

File "C:\Python27\asaReader", line 5, in <module> 
    line = line.split("extended ", 1)[1] 
IndexError: list index out of range 

텍스트 파일의 다음 데이터 행으로 이동하지 않으므로 이전 문자열 [1]에 아무 것도 없습니다. 내가 얻을 수있는 도움을 주시면 감사하겠습니다.

답변

2

유발할 수있는 요인은 다음과 같습니다

  • 당신은 당신은 빈없는 라인을 가지고
  • (을 확장 단어가 포함되지 않습니다 분명히 빈 줄) 파일에 빈 줄을 가지고 있지만 돈 ' t 당신은 문제가 발생한 위치를 확인하기 위해 개별적으로 선을 보내고 print을 시도 할 수

을 확장 단어가 포함

for line in input_file: 
    print("Got line: %s" % (line)) 
    line = line.split("extended ", 1)[1] 

아, 그리고 그것은 마지막 라인이 비어과 그에 실패있어 가능성이 있습니다. 놓치기가 쉬울 것입니다.

+0

각 줄에는 "확장"이라는 단어가 포함되어 있으며 텍스트 파일에는 빈 줄이 없습니다. 매우 일관된 형식을 취합니다. – user1650583

+0

@ user1650583 방금 편집 한 print 문을 추가하고 오류의 원인이되는 행을 알려주십시오. –

+0

줄 바꿈을위한 검색 기능을 통해 방금 파일을 찾았습니다. 이것은 문제를 해결했습니다 (그리고 저는 이것을 쓰면서 구두로 칭찬합니다). 나는 그것이 오류를 던질 것이라는 것을 몰랐지만, 어느 쪽이든, 내 문제를 해결했습니다. 이제는 내 밤을 계속할 수 있으므로 빠른 응답을 보내 주셔서 감사합니다. – user1650583

1

인쇄 뭔가 밖으로 당신이

for line in input_file: 
    try: 
     line = line.split("extended ", 1)[1] 
     line = line.split("(", 1)[0] 
     line = line.replace(" host", "") 
     line = line.replace(" eq", "") 
     output_file.write(line) 
    except Exception, e: 
     print "Choked on this line: %r"%line 
     print e 
0

는 또 다른 접근 방식은 모든 라인을 캐시하는 것입니다 처리 할 수없는 선을 명중 (파일을 가정하는 것은 엄청난되지 않습니다.)

>>> with open('/tmp/ConfigInput.txt', 'rU') as f: 
...  lines = f.readlines() 
...  
... 
>>> lines 
['access-list inbound_outside1 line 165 extended permit tcp any host 209.143.156.200 eq www (hitcnt=10086645) 0x3eb90594\n'] 
>>> lines = [re.sub('(^.*extended |\(.*$)', '', line) for line in lines] 
>>> lines 
['permit tcp any host 209.143.156.200 eq www \n'] 
>>> with open('/tmp/ConfigOutput.txt', 'w') as f: 
...  f.writelines(lines) 
...  
... 
>>> 
+0

흥미로운 접근 방식. 나는 그것에게 탄을주고 어느 것이 더 나은 실행하는지 볼 것이다; 파일이 방대하다.) – user1650583

관련 문제