2016-09-01 5 views
-1

私はヘッダーとフッターを持つファイル(html)のテンプレートを持っています。 <trbody>の直後にテキストを挿入しようとしています。 私は今それをやっている方法は、私は私が私のHTMLテーブルに追加する必要があり、各表の行のためにこれを呼び出すfileinput.input()すべてのファイルを読み取らずにファイルに書き込む

def write_to_html(self,path): 

for line in fileinput.input(path, inplace=1): 
    line = re.sub(r'CURRENT_APPLICATION', obj, line) 
    line = re.sub(r'IN_PROGRESS', time.strftime("%Y-%m-%d %H:%M:%S"), line) 
    line = re.sub(r'CURRENT_VERSION', svers, line) 
    print line, # preserve old content 
    if "<tbody>" in line: 
     print ("<tr>") 
     ###PRINT MY STUFFS 
     print ("</tr>") 

です。私は追加する約5kのテーブルラインがあります(各ラインはhmtlコードの約30行です)。それは速く始まりますが、各行は追加するのにますます多くの時間がかかります。これは、各行のファイルをもう一度全部書く必要があるからです。

処理を高速化する方法はありますか?

回答ありがとう: 私は大きな文字列を作成するのが好きで、ちょうど1回だけファイルを通過します。 私が示した機能がクラスにあるので、今は何かを変更する必要があります。私の主なプログラムでは、.jsonを含むフォルダを繰り返し処理します。

for json in jsonfolder : 
    Object_a = CLASS-A(json) #unserialization 
    Object_a.write_to_html() (the function i showed) 

私はにそれを回す必要があります。それは速いだろう

block_of_lines='' 
for json in jsonfolder : 
    Object_a = CLASS-A(json) #unserialization 
    block_of_line += Object_a.to_html_sting() 
Create_html(block_of_line) 

+1

私はこのファイルのどこかに ''があります。上記のコードを5,000回実行して、異なる ' ... '行を追加しましたか? 5,000行をリストにまとめ、 'if: 'in line:'ブロックに一度にすべてを追加するのはなぜでしょうか? – smarx

+0

あなたの例に「### PRINT MY STUFFS」というコメントがあり、その時点で5k行すべてを印刷してから、5k回ではなく1回だけサンプルコードを呼び出すことができますか?また、各行がの直後、つまり前の行のすぐ上に挿入されるため、表の行を逆順に渡すサンプルコードを呼び出していることになります。これは難しい作業のようです。 –

+0

インプレースライトの代わりに、別のファイルに保存しようとしましたか? – citaret

答えて

1

質問をもう一度読んで、次のような考えが生じます。 書き込みを3つのブロックに分割できますか?ヘッダー用、テーブル用、フッター用の3つのブロックに分割できますか?むしろ、これらの3つの置換行が何をしているかに依存するように見えますが、私が正しいとすれば、テンプレートを初めて使用するとき、つまり行を更新することしかできません。最初のjsonファイルで動作していて、残りのファイルは変更されません。からのコピーを使用して

file_footer = CLASS-A.write_html_header(path) 
for json in jsonfolder : 
    Object_a = CLASS-A(json) #unserialization 
    Object_a.write_to_html(path) #use the part of the function 
           # that just handles the json file here 
CLASS-A.write_html_footer(path, footer) 

次に、あなたのクラスでは、(彼らはクラスからだけではなく、インスタンス上で使用することができることを意味する)の静的メソッドとしてヘッダとフッタを書くために2つの新しい関数を定義 すなわち(独自のコード)

@staticmethod 
def write_html_header(path): 
    footer = [] 
    save_for_later = false 
    for line in fileinput.input(path, inplace=1): 
     line = re.sub(r'CURRENT_APPLICATION', obj, line) 
     line = re.sub(r'IN_PROGRESS', time.strftime("%Y-%m-%d %H:%M:%S"), line) 
     line = re.sub(r'CURRENT_VERSION', svers, line) 
     # this blocks prints the header, and saves the 
     # footer from your template. 
     if save_for_later: 
      footer.append(line) 
     else: 
      print line, # preserve old content 
     if "<tbody>" in line: 
      save_for_later = true 
    return footer 

私はあなたが「インプレース」を編集している理由は、テンプレートがの上書きを取得するという意味ではありません不思議ないので、それは、単一の使用形態のテンプレートの少ない、よりです。通常、テンプレートを使用すると、テンプレートから読み込み、編集したテンプレートを新しいファイルに書き出します。したがって、テンプレートは、再度、時には再利用することができます。

フッターセクションでは、ファイルを追加モードで開き、ヘッダー書き込み関数の呼び出しによって作成されたフッター配列にその行を書き込みます。

私はテンプレートを編集していないと、あなたにとって有益だと思います。

open the template (read only) 
open the new_file (in new, write mode) 
write the header into new_file 
loop over json files 
    append table content into new_file 
append the footer into new_file 

このようにして、jsonファイルをループしながら作成したファイルのビットを再読することは決してありません。それが問題であれば、ファイル全体をメモリに保存しようとしていません。

+0

私は 'copy(template.html、path)'を実行する関数を持っています。そして私はそのコピーで作業します。これは良い方法です。私はそれに取り組むつもりです – pwnsauce

-2

5000行は何もありません。行のリストを取得するにはf.readlines()を使用してファイル全体を読む:

with open(path) as f: 
    lines = f.readlines() 

次に、各ラインを処理し、最終的に1つの文字列にそれらを結合し、バックファイルへの全体の事を書きます。

+0

5000テーブルライン--->各テーブルラインは30htmlコードラインですので、最終ファイルでは150kラインです。テーブル行を追加するたびに '30 X number_of_table_line_already_in'と読みます。合計最後の行数は30(1 + 2 + 3 + ... + 5000)です。 – pwnsauce

+0

私はyoyがそれらをすべて読んでみるべきだと思います。あなたは何を失いましたか?あなたがしている場合は、コメントを追加してください... –

+0

これは私が今やっていることです、私は375KKの行を読むことに終わります(出力に約10分かかる) – pwnsauce

関連する問題