将文件中的行读入特定字段的列表

2024-09-27 02:22:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下文本文件job.txt。我想extract48638(没有单词cluster),时间字段,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 

所以每次格式改变时,任何人都可以帮助我得到一个通用函数来处理文件中所有这些不同的类型。你知道吗


Tags: 文件nametxtid列表timebatchjob
2条回答

可以用正则表达式解析这些行。 对于要显示的字段,可以将它们放在捕获组中,方法是将正则表达式的相关部分用括号括起来。 您可以使用regex匹配结果上的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列中的newly request time字段):

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

分析后的数据可在作业列表列表变量中找到。你知道吗

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

相关问题 更多 >

    热门问题