这里有一个快速而肮脏的方法来获得你想要的东西:
def extractTxt(fpth, joinchar=' '):
loglines = []
with open(fpth) as f:
incall = False
calllines = []
for line in f:
if line.startswith('seq open') or line.startswith('seq log'):
loglines.append('NULL')
elif line.startswith('seq call'):
incall = True
elif incall:
if line.startswith('seq done'):
incall = False
call = joinchar.join(l for l in calllines if l)
calllines = []
if not call.strip():
loglines.append('NULL')
else:
loglines.append(call)
else:
calllines.append(line.strip())
return loglines
extractTxt('seq.txt')
输出:
['NULL',
'retrieve BIOS data using F:\\tools64\\BiosConfigUtility64.exe /GetConfig:\\working\\bcudump.txt BCU is working',
'Open the firewall Firewall opened',
'NULL',
'SENDING UUTMonitor.exe /timeevent:PTEFIE',
'02/26/2018 23:07:59 : @@@@ begin_\\process\\ProcessInit.bat <BISCON Version=xxxx"> x y </BISCON> \\process\\ProcessInit.bat:::Parsing branding variables from INI files... found \\flags\\custom.ini PRODUCTIONLOCK not defined in custom.ini \\process\\ProcessInit.bat:::Calling SETVAR.BAT generated from INI data... 02/26/2018 23:08:04 : @@@@ end\\process\\ProcessInit.bat',
'NULL',
'Get SkeletonPO from \\working\\ubera.ini']
您可以通过传递不同的
joinchar
参数到
extractTxt
.我将把任何进一步的造型/组织任务留作练习。
详细信息
线路:
call = joinchar.join(l for l in calllines if l)
做了一些不同的事情。这个
join
method
将使用前面的字符串将字符串列表连接在一起。例如,以下表达式:
', '.join(['foo', 'bar', 'baz', 'bof'])
将生成此输出:
'foo, bar, baz, bof'
括号内的线条部分:
l for l in calllines if l
是一种叫做
generator expression
。这要解释起来有点复杂,但基本上它所做的就是列出
calllines
不是空的。如果您感兴趣,请参阅链接页了解更多详细信息。您可以通过展开该行来简化该行。总而言之,以下几行:
call = ''
for l in calllines:
# l evaluates to False if it is empty
if l:
call += l + joinchar
# remove any trailing joinchar
if call.endswith(joinchar):
call = call[:-len(joinchar)]
将具有与单行相同的效果
call = joinchar.join(l for l in calllines if l)
。