2012-12-14 44 views
2

我必须删除许多文件的前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,我不需要。

+0

至少,您可以使用-i标志在位。 – Anov

+0

@Anov ......这会让你失去原始文件。 – glglgl

+1

@glglgl你可以发送扩展标志而不是'',它会创建一个备份。正如OP所说,他“不必要地增加了一个fil * .sort”,我认为他不需要保留原文。 – Anov

回答

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可以帮助您节省时间* :-)。

*(或者,花一些你长的午餐学习更多的很酷的事情蟒蛇来!)

编码快乐!

+0

@glglgl - 你今天只是编辑我所有的答案,是不是;-) – mgilson

+0

只有当有东西需要编辑时:-) – glglgl

+0

@glglgl - 我确定你是否回头看过我的老答案,你会发现足够让自己一个复制编辑徽章:p – mgilson

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() 
+0

......就像第一种方法。 [mgilson的解决方案](http://stackoverflow.com/a/13882120/296974)是更好的,因为它是所有的东西本地而不是调用其他程序。 – glglgl

相关问题