2013-05-26 2 views
2

텍스트 파일의 특정 위치에 텍스트를 삽입하려고합니다. 이 텍스트 파일은 상당히 클 수 있습니다 (>> 10기가바이트)Python : 대용량 파일에서 텍스트 대체

나는 현재 읽어 사용하고 접근 :

with open("my_text_file.txt") as f: 
    while True: 
    result = f.read(set_number_of_bytes) 
    x = process_result(result) 
    if x: 
     replace_some_characters_that_i_just_read_and write_it_back_to_same_file 

을 그러나, 나는 어떻게 구현에 관해서는 확실하지 오전

replace_some_characters_that_i_just_read_and write_it_back_to_same_file 

파일에 쓸 수있는 현재 파일에서 읽은 위치를 확인하는 데 사용할 수있는 방법이 있습니까?

성능 측면에서 위의 방법을 사용하여 특정 위치의 원본 파일에 쓰려면 쓰기 전에 쓰기 위치를 찾는 데 따른 효율성 문제가 있습니까?

또는 완전히 다른 파일을 만들고 위의 각 루프에서 해당 파일을 추가하는 것이 좋습니다. 그런 다음이 작업이 완료된 후 원본 파일을 삭제 하시겠습니까? 공간이 큰 문제는 아니지만 성능이 있다고 가정합니다. 당신의 쓰기는 inplace 플래그를 사용하면

import sys 
import fileinput 

for line in fileinput.input('my_text_file.txt', inplace=True): 
    x = process_result(line) 
    if x: 
     line = line.replace('something', x) 

    sys.stdout.write(line) 

는, 원본 파일은 백업으로 이동, 아무것도 다음 inplace 플래그가 설정, 데이터를 교체 할 때 파일을 올바르게 처리

+0

바꾸는 텍스트가 원본과 정확히 같은 길이입니까? 그렇지 않다면 선택의 여지가 거의 없으므로 새 파일을 만들어야합니다. –

+0

텍스트가 모두 원본과 동일하지는 않습니다. 쓰기가 발생할 때마다 (루프 반복마다) fileinput 모듈이 내부적으로 새 파일을 생성합니까? (아래 언급) – user1431282

+1

@ user1431282 : 확장 내 대답; 파일은 옆으로 옮겨지고 필요에 따라 원본 데이터가 변경된 완전한 새 파일을 작성합니다. –

답변

4

사용 fileinput module, sys.stdout은 원래 파일 이름 (새 파일)에 기록됩니다. 변경된 모든 줄을 포함했는지 확인하십시오. 교체 데이터를 교체 할 부품으로 동일한 수의 바이트가 없습니다 정확히 때마다

당신은 전체 파일을 다시 작성이 .

관련 문제