2014-04-05 7 views
0

저는 Python을 처음 접했고이 문제를 파이썬으로 생각하는 데 어려움이 있습니다. SMS 메시지의 텍스트 파일이 있습니다. 캡처하려는 다중 행 문이 있습니다.Python의 라인 패턴 결정

import fileinput 

parsed = {} 

for linenum, line in enumerate(fileinput.input()): 
### Process the input data ### 
    try: 
     parsed[linenum] = line 
    except (KeyError, TypeError, ValueError): 
     value = None 
############################################### 
### Now have dict with value: "data" pairing ## 
### for every text message in the archive ##### 
############################################### 
for item in parsed: 
    sent_or_rcvd = parsed[item][:4] 
    if sent_or_rcvd != "rcvd" and sent_or_rcvd != "sent" and sent_or_rcvd != '--\n': 
     ########################################### 
     ### Know we have a second or third line ### 
     ########################################### 

하지만 여기서 나는 벽에 닿았습니다. 여기서 얻은 문자열을 포함하는 가장 좋은 방법이 무엇인지 모르겠습니다. 나는 전문가의 조언을 좋아한다. Python 2.7.3을 사용했지만 기꺼이 3으로 이동하십시오.

목표 :이 SMS에서 사람이 읽을 수있는 파일로 3 행의 전체 인용 부호를 사용하십시오.

예 텍스트 :

12425234123|2011-03-19 11:03:44|words words words words 
12425234123|2011-03-19 11:04:27|words words words words 
12425234123|2011-03-19 11:05:04|words words words words 
12482904328|2011-03-19 11:13:31|words words words words 
-- 
12482904328|2011-03-19 15:50:48|More bolder than flow 
More cumbersome than pleasure; 
Goodbye rocky dump 
-- 

(.. 당신이 그 똥에 대한 하이쿠이야 구하기 전에 네, 내 가장 친한 친구를 문자 메시지의 지난 5 년간을 캡처하기 위해 노력하고있어)

이상적인 결과는 다음과 같습니다.

Haipu 3
2011-03-19
More bolder than flow
More cumbersome than pleasure;
Goodbye rocky dump

+1

당신이 입력의 예를 준 당신이 우리에게 입력하는 간단한 예제를 줄 수 출력 –

+1

을 예상하는 경우가 helfpul 것 파일 및 출력으로 기대되는 내용은 무엇입니까? thx – jrjc

답변

1
import time 

data = """12425234123|2011-03-19 11:03:44|words words words words 
12425234123|2011-03-19 11:04:27|words words words words 
12425234123|2011-03-19 11:05:04|words words words words 
12482904328|2011-03-19 11:13:31|words words words words 
-- 
12482904328|2011-03-19 15:50:48|More bolder than flow 
More cumbersome than pleasure; 
Goodbye rocky dump """.splitlines() 

def get_haikus(lines): 
    haiku = None 
    for line in lines: 
     try: 
      ID, timestamp, txt = line.split('|') 
      t = time.strptime(timestamp, "%Y-%m-%d %H:%M:%S") 
      ID = int(ID) 
      if haiku and len(haiku[1]) ==3: 
       yield haiku 
      haiku = (timestamp, [txt]) 
     except ValueError: # happens on error with split(), time or int conversion 
      haiku[1].append(line) 
    else: 
     yield haiku 

# now get_haikus() returns tuple (timestamp, [lines]) 
for haiku in get_haikus(data): 
    timestamp, text = haiku 
    date = timestamp.split()[0] 
    text = '\n'.join(text) 
    print """{d}\n{txt}""".format(d=date, txt=text) 
+0

환상적인! 그것은 트릭을했다. 정확히 여기서 무슨 일이 일어나고 있는지 이해하기 위해 전화를 조사하고 있습니다. 나는'line.split'이 파싱을 쉽게 완성시키는 것을 보았다. 다시 한번 감사드립니다. – mbb

+0

하나의 catch :'open'을 사용하여 파일을 가져올 때'TypeError : exceptions' 문에서 'except' 문에서'NoneType '객체에'__getitem __ ''속성이 없습니다. 더 나은 오류 처리 또는 구문 분석을위한 권장 사항은 무엇입니까? 내가 그리워? – mbb

+0

알았습니다! 임의의 빈 줄을 전혀 처리하지 않았습니다. '하이쿠 (haiku)'에 'not and any'가 추가되었습니다. – mbb

1

좋은 시작은 다음과 같을 수 있습니다. 나는 data2이라는 파일에서 데이터를 읽었지만 read_messages 생성기는 반복 가능한 모든 행을 소비합니다.

#!/usr/bin/env python 

def read_messages(file_input): 
    message = [] 
    for line in file_input: 
     line = line.strip() 
     if line[:4].lower() in ('rcvd', 'sent', '--'): 
      if message: 
       yield message 
       message = [] 
     else: 
      message.append(line) 
    if message: 
     yield message 


with open('data2') as file_input: 
    for msg in read_messages(file_input): 
     print msg 

이 입력과 같을 것으로 예상 다음

sent 
message sent away 
it has multiple lines 
-- 
rcvd 
message received 
rcvd 
message sent away 
it has multiple lines