删除标题并添加另一个标题

时间:2012-12-14 15:29:36

标签: python unix sorting header

我必须删除许多文件的前2个标题,然后用另一个文件替换它们。由于我是Python和编程的新手,我一直在使用以下代码

import glob
import os
list_of_files = glob.glob('./*.txt')
for file_name in list_of_files:
    os.system('sed "1,2d" %s | sort -k1 > %s.sort' %(file_name,file_name))
    os.system ('cat header file %s.sort > %s.header' %(file_name,file_name))

哪个有效。但是我认为应该有更好的方法来完成这项工作。此外,我不必要地制作一个我不需要的额外文件* .sort。

2 个答案:

答案 0 :(得分:3)

信不信由你,你可以在纯python中轻松地做到这一点:

import itertools
with open(filename) as fin:
    ilines = itertools.islice(fin, 2, None) #this throws away the first 2 lines
    lines = sorted(ilines, key=lambda x: x.split()[0])  #sort lexicographically on first column

with open('header') as header, open('%s.header'%filename) as fout:
    fout.writelines(header) #write the header
    fout.writelines(lines) #write the data

你已经完成了。稍微延长午休时间,因为python可以帮助您节省时间*: - )。

*(或者,花一些长时间的午餐,学习更多python提供的很酷的东西!)

快乐的编码!

答案 1 :(得分:1)

避免使用os.system

第一种方法可能是

import glob
import subprocess
list_of_files = glob.glob('./*.txt')
for file_name in list_of_files:
    sp1 = subprocess.Popen(['sed', '1,2d', file_name], stdout=subprocess.PIPE)
    sp2 = subprocess.Popen(['sort', '-k1'], stdin=sp1.stdout, stdout=subprocess.PIPE)
    out = open(file_name + '.header', 'w')
    sp3 = subprocess.Popen(['cat', 'header', 'file', '-'], stdin=sp2.stdout, stdout=out)
    sp1.stdout.close() # sp2 got it, not our business any longer
    sp2.stdout.close() # sp3 got it, not our business any longer
    out.close()
    sp1.wait()
    sp2.wait()
    sp3.wait()