只写一行文件的某些列(用空格分隔)

时间:2015-07-08 19:58:42

标签: python text file-io

我正在逐行阅读日志。我试图只打印该行的某些列。使用bash脚本我会使用awk和$来分隔它。但是,我无法弄清楚如何用Python做到这一点。我尝试使用split,但它并没有完全符合我的要求。

我的代码现在:

for line in file:
    if STORED_PROCS_BEGIN in line:
        log.write(line)
    elif STORED_PROCS_FINISHED in line:
        log.write(line)
    elif STORED_TASK_BEGIN in line:
        log.write(line)
    elif STORED_TASK_FINISHED in line:
        log.write(line)
    elif ACTUATE_REPORT_SCHEDULE in line:
        break

所以当我尝试格式化传入write()的行时。

我想要的例子:

日期时间信息junk1 junk2 name =>日期时间信息名称

编辑:我有一个想法,我可以拆分和提取我想要的字段,他们将它们连接在一起..但必须有一个更好的。

3 个答案:

答案 0 :(得分:2)

您可以使用split()将一行分成单词,这是正确的。然后,您可以索引要在输出中包含的列:

line = 'date time info junk1 junk2 name'
parts = line.split()
parts_I_want = parts[0:3] + parts[5:6]
print ' '.join(parts_I_want)

如果您只想删除某些列,还可以使用del

line = 'date time info junk1 junk2 name'
parts = line.split()
del parts[4]  # junk2
del parts[3]  # junk1
print ' '.join(parts)

答案 1 :(得分:1)

试试这个:

to

答案 2 :(得分:1)

我假设列与标签隔开。 如果你真的不想这样做:

columns = line.split("\t")
line = "\t".join(columns[:3] + columns[5:])

或更紧凑和更丑陋:

line = "\t".join(line.split("\t")[:3] + line.split("\t")[5:])

...你可以使用正则表达式替换:

line = re.sub(r'(\S+\t\S+\t\S+)\t\S+\t\S+\t(\S+)', r'\1\t\2', line)

\ t =标签

\ S + =一个或多个非空白字母

()= group

将前四列分组为引用\ 1,将最后一列分组为引用\ 2 two,将匹配表达式替换为组1,将两个分隔为选项卡。

参与交互式python:

$ re.sub(r'(\S+\t\S+\t\S+)\t\S+\t\S+\t(\S+)', r'\1\t\2',line)
'date\ttime\tinfo\tname'