我必须删除许多文件的前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 :(得分: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()