【问题标题】:Parsing a text file and outputting to new file解析文本文件并输出到新文件
【发布时间】:2011-10-31 15:54:30
【问题描述】:

我是 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”、“否”等(一行)

这个例子是逗号分隔的,但它可能会改变,但我想我会从那里开始。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 记录分隔符是什么?

标签: python parsing


【解决方案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 好运。

【讨论】:

    【解决方案2】:
    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', ',')
    

    【讨论】:

      【解决方案3】:

      首先打开文件:

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

      如果您使用的是 python 2.5 及更高版本,请使用 with 成语,否则请使用:

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

      要将文件内容读入字符串,请查看file.readline()(一次读取一行;用于大文件)和file.readlines()(将整个文件读入列表,每个条目一个字符串)here

      要写入文件,除了以写入模式打开文件外,使用上述逻辑进行读取,如下所示:open('outputfile','w')

      要处理输出文件的格式,请查看字符串方法here。具体来说,看一下str.split()str.join(),它们可以让您轻松地将字符串拆分为列表,并通过分隔符将列表元素连接为字符串。

      【讨论】:

        【解决方案4】:
        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))
        

        【讨论】:

          猜你喜欢
          • 2015-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-04
          相关资源
          最近更新 更多