2011-03-27 6 views
37

파일을 한 줄씩 구문 분석하고 해당 줄을 지나는 동안 해당 줄을 편집 할 수 있습니까?파일에서 행을 수정할 수 있습니까?

+1

특정 조건에서 가능합니다. 처리 된 라인을 편집 한 결과 라인이 처리 된 라인보다 짧거나 긴 경우, 쉽게 처리 할 수 ​​있습니다. 그렇지 않은 경우 편집을 수행하는 선이 너무 많지는 않지만 불가능하지는 않지만 더 어려워집니다. 큰 파일을 다루기 때문에이 질문을합니까? – eyquem

+1

>>> f = open ('tmp', 'r +') >>> f.readline() '75 .14 \ n ' >>> f.readline() '100 \ n' >>> l = _ >>> f.seek (-l.len(), file.SEEK_CUR) >>> f.seek (-len (l), os .SEEK_CUR) >>> f.write ('999 \ n') >>> f.close() >>> – Bob

+0

보기 (http://stackoverflow.com/questions/5286020/python-string) -replace-in-a-file-touch-the-no-substitution-file-without-no-substitution-)은 – eyquem

답변

34

파일을 한 줄씩 구문 분석하고 해당 줄을 통과하면서 해당 줄을 편집 할 수 있습니까?

백업 파일을 사용하여 stdlib의 fileinput module처럼 시뮬레이션 할 수 있습니다.

#!/usr/bin/env python 
# grep_some_condition.py 
import fileinput 

for line in fileinput.input(inplace=True, backup='.bak'): 
    if some_condition(line): 
     print line, # this goes to the current file 

예 :

$ python grep_some_condition.py first_file.txt second_file.txt 
완료 first_file.txt

second_file.txt 파일이 포함됩니다 여기

명령 행 또는 stdin에 주어진 파일에서 some_condition을 만족하지 않는 행을 제거하는 예제 스크립트입니다 술어 some_condition()을 만족시키는 행만.

+0

실제로 파일의 중간에 쓰지 않는 메서드는 현명합니다. 왜냐하면 수정을 원자 적으로 쉽게 할 수 있기 때문입니다 (즉, 프로그램이 중단되면 파일이 부분적으로 수정 된 상태로 끝나지 않습니다). – L33tminion

0

문자의 줄 크기로 백업해야합니다. 다음 줄의 길이를 얻을 사용하여 백업 할 수 있습니다, 당신은 readline를 사용 가정 :

file.seek(offset[, whence]) 

설정 어디서를 SEEK_CUR에, -length 오프셋을 설정합니다.

Python Docs을 참조하거나 맨 페이지의 seek을 참조하십시오.

4

아니요. 파일을 변경하면 읽지 않은 내용을 덮어 쓸 수 있기 때문에 읽고있는 파일에 안전하게 쓸 수 없습니다. 안전하게하려면 파일을 버퍼로 읽어 들여 필요한 모든 행을 업데이트 한 다음 파일을 다시 써야합니다.

파일의 바이트 단위를 바꾸는 경우 (즉, 바꾸려는 텍스트가 바꾸는 새 문자열과 동일한 길이 인 경우), 파일에서 벗어날 수 있습니다. 하지만 그것은 호 넷 둥지이므로 번거 로움을 덜어주고 전체 파일을 읽거나 메모리의 내용을 임시 파일로 바꾼 다음 다시 써주세요.

+2

모드 'rb +'는 파일을 읽고, 이동하고, 쓸 수있게 해준다. – eyquem

+1

@eyquem - 좋은 지적, 나는 나의 대답을 업데이트 할 것이다. –

2

수정 된 파일 부분의 길이를 변경하지 않는 지역화 된 변경 만 수행하려는 경우 (예 : 모든 문자를 소문자로 변경) 실제로 파일의 이전 내용을 실제로 덮어 쓸 수 있습니다.

이렇게하려면 seek() 메서드가 file 인 임의의 파일 액세스를 사용할 수 있습니다.

또는 mmap 개체를 사용하여 전체 파일을 변경 가능한 문자열로 처리 할 수 ​​있습니다. mmap 개체는 운영 체제 및 해당 구성에 따라 32 비트 CPU에서 2-4GB 범위의 최대 파일 크기 제한을 부과 할 수 있습니다.

관련 문제