1

ここでgrepの回答を検索しましたが、回答が見つかりません。それらはすべて、ファイルからの文字列のリストではなく、ファイル内の文字列を検索しているように見えます。私はすでに機能する検索機能を持っていますが、grepはそれをはるかに高速に実行します。ファイルsn.txtに文字列のリストがあります(各行に1つの文字列があり、デリミネーターはありません)。別のファイル(Merge_EXP.exp)で一致する行を検索し、それを新しいファイルに書き出したい。私が検索しているファイルには50万行あるので、そこで数千を検索するにはgrepなしで数時間かかります。

Windowsのコマンドプロンプトから実行すると、数分で実行されます。

grep --file=sn.txt Merge_EXP.exp > Merge_EXP_Out.exp

Pythonからこれと同じプロセスを呼び出すにはどうすればよいですか?私はPythonで代替手段を本当に望んでいません。なぜなら、私はすでに機能するものを持っているのですが、時間がかかるからです。そのパフォーマンスを大幅に向上させることができると思わない限り、次のようになります。

def match_SN(serialnumb, Exp_Merge, output_exp):
    fout = open(output_exp,'a')
    f = open(Exp_Merge,'r')
    # skip first line
    f.readline()
    for record in f:
        record = record.strip().rstrip('\n')
        if serialnumb in record:
            fout.write (record + '\n')
    f.close()
    fout.close()

def main(Output_CSV, Exp_Merge, updated_exp):

    # create a blank output
    fout = open(updated_exp,'w')

    # copy header records
    f = open(Exp_Merge,'r')
    header1 = f.readline()
    fout.write(header1)
    header2 = f.readline()
    fout.write(header2)
    fout.close()
    f.close()

    f_csv = open(Output_CSV,'r')
    f_csv.readline()
    for rec in f_csv:
        rec_list = rec.split(",")
        sn = rec_list[2]
        sn = sn.strip().rstrip('\n')
        match_SN(sn,Exp_Merge,updated_exp)
4

3 に答える 3

0

grep の場所へのフル パスを使用すると、機能しました (grep_loc、Serial_List、Export を渡します)。

import os

Export_Dir = os.path.dirname(Export)
Export_Name = os.path.basename(Export)

Output = Export_Dir + "\Output_" + Export_Name
print "\nOutput: " + Output + "\n"

cmd = grep_loc + " --file=" + Serial_List + " " + Export + " > " + Output
print "grep usage: \n" + cmd + "\n"
os.system(cmd)
print "Output created\n"
于 2013-02-25T17:52:42.260 に答える
0

これは、純粋な python コードの最適化されたバージョンです。

def main(Output_CSV, Exp_Merge, updated_exp):
    output_list = []

    # copy header records
    records = open(Exp_Merge,'r').readlines()
    output_list = records[0:2]

    serials = open(Output_CSV,'r').readlines()
    serials = [x.split(",")[2].strip().rstrip('\n') for x in serials]

    for s in serials:
        items = [x for x in records if s in x]
        output_list.extend(items)

    open(updated_exp, "w").write("".join(output_list))

main("sn.txt", "merge_exp.exp", "outx.txt")

入力

sn.txt:

x,y,0011
x,y,0002

merge_exp.exp:

Header1
Header2
0011abc
0011bcd
5000n
5600m
6530j
0034k
2000lg
0002gg

出力

Header1
Header2
0011abc
0011bcd
0002gg

これを試して、どれくらいの時間がかかるかを確認してください...

于 2013-02-22T14:37:38.773 に答える