2016-09-01 4 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 라인)입니다. 그것은 빠르게 시작하지만 각 라인은 추가 될 때까지 더 많은 시간이 걸립니다. 각 행에 대해 파일을 다시 작성해야하기 때문입니다.

프로세스 속도를 높일 방법이 있습니까?

답장을 보내 주셔서 감사합니다. 큰 문자열을 만드는 데 이상적이며 방금 한 번 파일을 통과합니다. 내가 보여준 함수가 클래스에 있기 때문에 지금부터는 몇 가지 요소를 변경해야합니다. 내 주요 프로그램에서는 .json이 들어있는 폴더를 반복합니다.

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) 

가 빨리 될 것이다 :

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

은 그게로 설정해야 ?

+1

정확하게 이해하면이 파일의 어딘가에 ''이 있는데, 위의 코드를 5,000 번 실행하면 ' ...'행을 5,000 개 추가 할 수 있습니까? 왜 5000 행을 모두 목록에 넣고 'if : 'in line :'블록에 한번에 모두 추가하지 않을까요? – smarx

+0

예제에 "### PRINT MY STUFFS"라는 주석이있는 곳에서 전화를 걸면 그 시점에서 5k 줄을 모두 인쇄 한 다음 5k 번이 아니라 한 번만 예제 코드를 호출 할 수 있습니까? 또한 각 행이 바로 뒤에 삽입되기 때문에 테이블 행을 역순으로 전달하는 예제 코드를 호출한다는 의미입니다. 즉, 앞선 행 바로 위에 - 힘든 작업처럼 보입니다. –

+0

inplace 쓰기 대신 다른 파일에 저장하려고 시도 했습니까? – citaret

답변

1

몇 번 더 질문을 다시 읽으면 다음과 같은 생각이 들게됩니다. 글을 머리글, 표 줄, 바닥 글에 대해 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) 

그런 다음 클래스에, 헤더를 작성하고 (에서 복사본을 사용 즉, (그들이 클래스에서보다는 인스턴스에서 사용할 수있는 의미)와 같은 정적 메서드를 바닥 글에 두 개의 새로운 함수를 정의 당신이 '인플레 이스'를 편집하고 그 템플릿 GET의 덮어 의미하지 않으며, 따라서 그것은 하나의 사용 형태의 템플릿의 점점 더 이유를 자신의 코드)

@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 줄이 없습니다.

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

그런 다음 각 행을 처리하고 결국 하나 개의 문자열에 가입하고 다시 파일의 전체 일을 쓰기 : 라인의 목록을 가져올 수 f.readlines()를 사용하여 전체 파일을 읽습니다.

+0

5000 테이블 라인 ---> 각 테이블 라인은 30 html 코드 라인이므로 최종 파일에서 150k 라인입니다. 그러나 테이블 행을 추가 할 때마다'30 X number_of_table_line_already_in'을 읽습니다. 총 끝에 읽은 줄 수는 30 (1 + 2 + 3 + ... + 5000)입니다. – pwnsauce

+0

나는이 모든 것을 읽으려고 노력해야한다고 생각합니다. 잃을 게 뭐야? 당신이 할 경우, 코멘트를 추가하십시오 ... –

+0

그것은 지금 내가 뭘하는지, 나는 375KK 라인을 읽는 것을 끝낸다. (출력하는데 약 10 분 걸린다.) – pwnsauce

관련 문제