[Python] 파이썬에서 큰 파일로부터 라인을 삭제하는 가장 빠른 방법


Answers

파일 을 제자리에서 수정하면 불쾌한 줄이 공백으로 바뀌므로 파일의 나머지 부분을 디스크에 넣지 않아도됩니다. 수정 사항 이 교체 할 줄보다 길지 않은 경우 줄을 제자리에 " 고정 "할 수도 있습니다

import os
from mmap import mmap
def removeLine(filename, lineno):
    f=os.open(filename, os.O_RDWR)
    m=mmap(f,0)
    p=0
    for i in range(lineno-1):
        p=m.find('\n',p)+1
    q=m.find('\n',p)
    m[p:q] = ' '*(q-p)
    os.close(f)

다른 프로그램이 행 번호 대신 fileoffset을 출력하도록 변경 될 수있는 경우 p에 직접 오프셋을 할당하고 for 루프없이 수행 할 수 있습니다

Question

Linux 시스템에서 매우 큰 (~ 11GB) 텍스트 파일로 작업하고 있습니다. 내가 파일을 오류를 검사하는 프로그램을 통해 그것을 실행하고 있습니다. 오류가 발견되면 선을 수정하거나 선을 완전히 제거해야합니다. 그리고 다시 ...

결국 프로세스에 익숙해지면 완전히 자동화 할 것입니다. 그러나 지금은 이것을 손으로 돌리고 있다고 가정 해 봅시다.

이 큰 파일에서 특정 라인을 제거하는 가장 빠른 방법은 (실행 시간면에서) 무엇입니까? 나는 파이썬에서 그렇게 생각했다. 그러나 다른 예제를 열어 보았다. 이 줄은 파일의 어느 위치 에나 있을 수 있습니다.

파이썬의 경우 다음 인터페이스를 가정합니다.

def removeLine(filename, lineno):

감사,

아즈




라인이 가변 길이라면, 필자는 원하지 않는 라인을 제외하고 모든 라인을 작성하고 모든 라인을 작성하는 것보다 더 나은 알고리즘이 있다고 믿지 않는다.

이러한 기준은 몇 가지 기준을 확인하거나 원하지 않는 라인의 읽기 및 쓰기를 억제하여 식별 할 수 있습니다.

행이 고정 길이이고 특정 행 번호를 삭제하려는 경우 파일 포인터를 이동하기 위해 seek 을 사용할 수 있습니다 ... 나는 그 행운이 의심 스럽습니다.




@OP, awk를 사용할 수 있다면, 예를 들어 행 번호가 10이라고 가정합니다.

$ awk 'NR!=10' file > newfile



def removeLine(filename, lineno):
    in = open(filename)
    out = open(filename + ".new", "w")
    for i, l in enumerate(in, 1):
        if i != lineno:
            out.write(l)
    in.close()
    out.close()
    os.rename(filename + ".new", filename)