2014-10-19 2 views
0

나는 다음과 같은 형식이 텍스트 파일을 구문 분석하는 것을 시도하고있는 CSV로 출력 파일 :구문 분석 및 파이썬

+++++ 
line1 
line2 
<<<<< 
+++++ 
rline1 
rline2 
<<<<< 

, +++++는 기록의 시작을 의미 <<<<< 레코드의 끝을 의미한다.

는 이제 다음과 같은 형식으로 출력 CSV로 전체 텍스트를 원하는 :

line1, line2 
rline1, rline2 

이 같은 STH을 시도하고있다 :

lines =['+++++', 'line1', 'line2', '<<<<<', '+++++', 'rline1', 'rline2', '<<<<<'] 
output_lines =[] 

for line in lines: 
    if (line == "+++++") or not(line == "<<<<<") : 
     if (line == "<<<<<"): 
      output_lines.append(line) 
      output_lines.append(",") 

print (output_lines) 

여기에서 앞으로 이동하는 방법을 잘 모르겠습니다 .

답변

0

수집 최후의 기록 마커까지 중첩 루프의 라인, 및 CSV 파일 결과 목록 써 :

import csv 

with open(inputfilename) as infh, open(outputfilename, 'w', newline='') as outfh: 
    writer = csv.writer(outfh) 
    for line in infh: 
     if not line.startswith('+++++'): 
      continue 

     # found start, collect lines until end-of-record 
     row = [] 
     for line in infh: 
      if line.startswith('<<<<<'): 
       # found end, end this inner loop 
       break 
      row.append(line.rstrip('\n')) 

     if row: 
      # lines for this record are added to the CSV file as a single row 
      writer.writerow(row) 

외부 루프는 입력 파일의 라인을 얻어, 그러나 어떤 건너 뛰고 기록의 시작처럼 보이지 않습니다. 시작이 발견되면 두 번째 내부 루프는 파일 객체에서 개 이상의 행을 그립니다. 이 아닐 경우은 레코드 끝 부분처럼 보이며 줄 객체에 추가됩니다 (줄 구분 기호 제외). .

레코드의 끝이 발견되면 내부 루프가 종료되고 row 목록에 줄이 수집되면 CSV 파일에 기록됩니다.

데모 : writer.writerow()에 의해보고 된 서면 선 후

>>> import csv 
>>> from io import StringIO 
>>> import sys 
>>> demo = StringIO('''\ 
... +++++ 
... line1 
... line2 
... <<<<< 
... +++++ 
... rline1 
... rline2 
... <<<<< 
... ''') 
>>> writer = csv.writer(sys.stdout) 
>>> for line in demo: 
...  if not line.startswith('+++++'): 
...   continue 
...  row = [] 
...  for line in demo: 
...   if line.startswith('<<<<<'): 
...    break 
...   row.append(line.rstrip('\n')) 
...  if row: 
...   writer.writerow(row) 
... 
line1,line2 
13 
rline1,rline2 
15 

숫자는, 기입해진 바이트 수 있습니다.

1

어쩌면 이렇게 될까요?

from itertools import groupby 
import csv 

lines =['+++++', 'line1', 'line2', '<<<<<', '+++++', 'rline1', 'rline2', '<<<<<'] 

# remove the +++++s, so that only the <<<<<s indicate line breaks 
cleaned_list = [ x for x in lines if x is not "+++++" ] 

# separate at <<<<<s 
rows = [list(group) for k, group in groupby(cleaned_list, lambda x: x == "<<<<<") if not k] 

f = open('result.csv', 'wt') 
try: 
    writer = csv.writer(f) 
    for row in rows: 
     writer.writerow(row) 
finally: 
    f.close() 

print open('result.csv', 'rt').read() 
+0

groupby를 잘 사용하지만 여기에서 무슨 일이 벌어지고 있는지에 대한 간단한 설명을 추가 할 수 있습니다. – PaulMcG