我是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
对于每个'Record','@ C'和'@T'是字段分隔符,后跟空格,然后是字段名称,后跟空格,然后是字段数据。我需要在一行中分隔的所有字段数据,而不是如上所示的列。
我希望将每个记录输出到一个新文件,就像这样。
“R000358”,“R000358”,“R000358”,“R000358”,“否”等等(在一行中)
此示例以逗号分隔,但可能会更改,但我想我会从那里开始。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分: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)
祝你好运。
答案 1 :(得分: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', ',')
答案 2 :(得分:0)
首先打开文件:
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()
,它可以让您轻松地将字符串拆分为列表,并通过分隔符将列表元素连接成字符串。
答案 3 :(得分: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))