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を不必要に作成しています。

4

2 に答える 2

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が提供するクールなものについてもっと学びましょう!)

ハッピーコーディング!

于 2012-12-14T15:59:31.763 に答える
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()
于 2012-12-14T15:36:02.027 に答える