从文件读取行到特定字段的列表

时间:2015-02-26 08:44:46

标签: python file

我有以下文本文件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 

因此,每次格式更改时,任何人都可以帮助我获取一个通用函数来处理文件中的所有这些不同类型。

2 个答案:

答案 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 列表变量中找到。