kdtrv의 대답에 변화를. 이 버전은 기존 파일 내용을 유지하고 라인 순서를 유지하는 write_lines 메소드를 제공합니다.
class Prepender(object):
def __init__(self,
file_path,
):
# Read in the existing file, so we can write it back later
with open(file_path, mode='r') as f:
self.__write_queue = f.readlines()
self.__open_file = open(file_path, mode='w')
def write_line(self, line):
self.__write_queue.insert(0,
"%s\n" % line,
)
def write_lines(self, lines):
lines.reverse()
for line in lines:
self.write_line(line)
def close(self):
self.__exit__(None, None, None)
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
if self.__write_queue:
self.__open_file.writelines(self.__write_queue)
self.__open_file.close()
with Prepender('test_d.out') as f:
# Must write individual lines in reverse order
f.write_line('This will be line 3')
f.write_line('This will be line 2')
f.write_line('This will be line 1')
with Prepender('test_d.out') as f:
# Or, use write_lines instead - that maintains order.
f.write_lines(
['This will be line 1',
'This will be line 2',
'This will be line 3',
]
)
이 용도로 사용하면 로그 파일과 유사하여 연속 실행시 로그에 기록 될 수 있습니다. 메모리에 전체 파일을 저장하는 유일한 수단은 무엇입니까? 처음에 내용을 쓰고 이전 내용을 모두 따르십시오. (중간 파일 생성 제외) –
Python의'file' 클래스에서 이와 같이 직접적으로 (즉, 일종의 중간 버퍼를 사용하지 않고) 허용하는 것을 전혀 알지 못합니다. 그래서, 지금은 가장 간단한 방법처럼 보입니다. 로그 파일의 경우 파일 끝에 최신 항목을 추가하기 만하면 훨씬 더 이해하기 쉽고 삶을 훨씬 단순하게 만들지 않겠습니까? – MAK
@Nick, @MAK, Python에는 이것을 처리 할 수있는 것이 없으며 기본 C 라이브러리 또는 파일 시스템에는 아무 것도 없습니다. 이것은 단순히 파일이 작동하는 방식이 아니며, 콘텐츠를 복사하려고하지 않는 한 추가하는 것 이외의 파일을 성장시킬 수 없습니다. 새 파일을 사용하거나 이전 파일 내에서 데이터를 이동하여 수행 할 수 있지만 그 중 한 가지 방법은 잘못된 생각 일 가능성이 큽니다. 요구 사항을 변경하거나 문제를 보는 방식을 개선하십시오 ... –