我有以下文本文件job.txt
。我想extract
少数字段,例如48638
(没有字词集群),时间字段,每行中的Q
到列表中。
请指导我,我试过这些:
content = [x.strip('\n') for x in content]
stlist=content[2:]
删除前两行,但无法获得如下输出。
列表的输出必须如下:
48758 45:00:40 R qp32
job.txt-is
如下:
Job id Name User Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
48638.tyrone-cluster ...01R-1850-01_2 mcbkss 0 Q qp32
48738.tyrone-cluster case3sqTS1e-4 mecvamsi 588:30:5 R qp32
48758.tyrone-cluster meshA5 mecmdjim 45:00:40 R qp32
编辑:上述文件也可以采用其他格式 没有空格的文件的文本如下所示。原始文件由上面的代码组成的空格。
Job id Name User Time Use S Queue
------------------------- ---------------- --------------- -------- - ----
48998.tyrone-cluster gic1_nwgs mbupi 18:45:44 R qp32
48999.tyrone-cluster gic2_nwgs mbupi 0 Q batch
49005.tyrone-cluster ...01R-1849-01_2 mcbkss 00:44:23 R qp32
8687.tyrone-cluster gaussian_top.sh chemraja 0 Q qp32
49047.tyrone-cluster jet_egrid asevelt 312:33:0 R qp128
49052.tyrone-cluster case3sqTS1e-4 mecvamsi 0 Q qp32
49053.tyrone-cluster ...01R-1850-01_1 mcbkss 0 Q batch
49054.tyrone-cluster ...01R-1850-01_2 mcbkss 0 Q batch
因此,每次格式更改时,任何人都可以帮助我获取一个通用函数来处理文件中的所有这些不同类型。
答案 0 :(得分:1)
Regex在这里有点矫枉过正,你可以使用字符串拆分而使用islice
来忽略前两行。从那些中取出所有内容到第一个.
,然后从剩余部分中取出最后两个单词,例如:
from itertools import islice
with open('job.txt') as fin:
for line in islice(fin, 2, None):
num, _, rest = line.partition('.')
_, letter, code = rest.rsplit(None, 2)
print num, letter, code
答案 1 :(得分:0)
您可以使用正则表达式解析行。 要显示的字段,可以通过用括号括起正则表达式的相关部分将它们放在捕获组中。 您可以在正则表达式匹配结果上使用group()方法提取这些捕获组。
import re
# joblist list will store each line of parsed output
joblist=[]
prog = re.compile('^(\d+)\..*\s+.*\s+\w+\s+(.*)\s+(\w)\s+(.*)$')
with open('job.txt','r') as jobfile:
for line in jobfile.readlines():
result = prog.match(line)
# Handle header line and skip lines that don't match regex
if result is None:
continue
else:
joblist.append(' '.join([result.group(1), result.group(2), result.group(3), result.group(4)]))
# displaying the list
for job in joblist:
print job
您提供的数据:
macbook:Downloads joeyoung$ cat job.txt
Job id Name User Time Use S Queue
48638.cluster ...01R-1850-01_2 mcbkss 0 Q qp32
48738.cluster case3sqTS1e-4 mecvamsi 588:30:5 R qp32
48758.cluster meshA5 mecmdjim 45:00:40 R qp32
48638.tyrone-cluster ...01R-1850-01_2 mcbkss 0 Q qp32
48708.tyrone-cluster ...onwgs_entries mbupi 0 Q qp32
48736.tyrone-cluster ...01R-1850-01_1 mcbkss 0 Q batch
48737.tyrone-cluster ...01R-1850-01_2 mcbkss 0 Q batch
上述数据的脚本输出(包括第2列中的新请求时间字段):
macbook:Downloads joeyoung$ python parsejob.py
48638 0 Q qp32
48738 588:30:5 R qp32
48758 45:00:40 R qp32
48638 0 Q qp32
48708 0 Q qp32
48736 0 Q batch
48737 0 Q batch
解析后的数据可在 joblist 列表变量中找到。