2011-10-31 83 views
0

我是一個完整的Python初學者。我遇到了需要格式化的文本文件。我基本上需要採用以特定字符開頭的字段數據,並將字段數據輸出到一個新文件,該文件將使所有字段由我選擇的字符分隔。解析文本文件並輸出到新文件

這是一個簡短的例子。

; Record 1 
@FULLTEXT PAGE 
@T R000358 
@C ENDDOC# R000358 
@C BEGATTACH R000358 
@C ENDATTACH R000358 
@C MAILSTORE No 
@C AUTHOR 
@C BCC 
@C CC 
@C COMMENTS 
@C ATTACH 
@C DATECREATED 11/23/2010 
@C DATELASTMOD 07/18/2010 
@C DATELASTPRNT 
@C DATERCVD 
@C DATESENT 
@C FILENAME wrangling.wpd 
@C LASTAUTHOR 
@C ORGANIZATION 
@C REVISION 
@C SUBJECT 
@C TIMEACCESSED 00:00:00 
@C TIMECREATED 15:21:34 
@C TIMELASTMOD 09:04:12 
@C TIMELASTPRNT 
@C TIMERCVD 
@C TIMESENT 
@C TITLE 
@C TO 
@C FROM 

對於每個「記錄」的「@C」和「@T」是字段分隔符後跟一個空格,那麼字段名,後跟一個空格,則場數據。我需要所有的字段數據分隔在一行中,而不是像上面所示的一列。

我正在尋找輸出到一個新的文件,每個記錄到這樣的事情。

「R000358」, 「R000358」, 「R000358」, 「R000358」, 「否」,等等,等等(在一行中)

這個例子是逗號分隔的,但它可能會改變,但我想我會從那裏開始。

任何幫助,將不勝感激。提前致謝。

+0

什麼是記錄分隔符? –

+0

一個分號(;) – damorph

回答

0
def getRecordRows(file, start_characters, delimiter): 
    returnRows = [] 
    for line in open(file): 
     if line.startswith(start_characters): 
      returnRows.append(line[len(start_characters):]) 
    return delimiter.join(returnRows) 

用法示例:

file = /path/to/file 
getRecordRows(file, '@T', ',') 
1

目前尚不清楚的記錄被分隔願與您和您的輸出到底該怎麼做,但這裏是一個簡單的解析器,應該讓你開始:

s = '''\ 
; Record 1 
@FULLTEXT PAGE 
@T R000358 
@C ENDDOC# R000358 
@C BEGATTACH R000358 
@C ENDATTACH R000358 
@C MAILSTORE No 
@C AUTHOR 
@C BCC 
@C CC 
@C COMMENTS 
@C ATTACH 
@C DATECREATED 11/23/2010 
@C DATELASTMOD 07/18/2010 
@C DATELASTPRNT 
@C DATERCVD 
@C DATESENT 
@C FILENAME wrangling.wpd 
@C LASTAUTHOR 
@C ORGANIZATION 
@C REVISION 
@C SUBJECT 
@C TIMEACCESSED 00:00:00 
@C TIMECREATED 15:21:34 
@C TIMELASTMOD 09:04:12 
@C TIMELASTPRNT 
@C TIMERCVD 
@C TIMESENT 
@C TITLE 
@C TO 
@C FROM 
'''.splitlines() 

records = [] 
record = {} 
for line in s: 
    if line.startswith('; Record'): 
     record = {} 
     records.append(record) 
    elif line.startswith(('@T ', '@C ')): 
     f = line.split() 
     fieldname = f[1] 
     i = line.find(fieldname) + len(fieldname) 
     fieldvalue = line[i:].lstrip() 
     record[fieldname] = fieldvalue 

import pprint 
pprint.pprint(records) 

祝你好運與Python。

0

開始通過打開文件:如果你正在使用python 2.5及以上,

with open('inputfile','r') as fil: 
    # file read-in stuff here 

使用with成語否則做:

try: 
    fil = open('inputfile','r') 
    # file read-in stuff here 
finally: 
    fil.close() 

讀取文件內容爲字符串,檢查out file.readline()(一次只讀一行;用於大文件)和file.readlines()(將整個文件讀入一個列表,每個條目一個字符串)here

寫入文件,用上面的邏輯,除了開放閱讀寫入模式文件,像這樣的:open('outputfile','w')

要處理格式化輸出文件,看看字符串方法here。具體來說,請看str.split()str.join(),它們可讓您輕鬆地將字符串拆分爲列表,並通過分隔符將列表元素連接成字符串。

0
record = None 
records = [] 

with open('records.dat') as stream: 
    for line in stream: 
     item = line.strip().split() 
     if not item: 
      continue 
     if item[0] == ';': 
      record = [] 
      records.append((item[-1], record)) 
     elif record is not None: 
      if item[0] == '@C' and len(item) <= 2: 
       record.append('') 
      elif item[0] in ('@T', '@C'): 
       record.append(item[-1]) 

for identifier, record in records: 
    print '[%s]: %s' % (identifier, ', '.join(record))