2010-04-20 3 views
18

나는 지금 이렇게하고 있지만 파일의 시작 부분에 쓰기를 원한다. out.txt의 내용이 될 수 있도록파일의 시작 부분에 write()?

f = open('out.txt', 'a') # or 'w'? 
f.write("string 1") 
f.write("string 2") 
f.write("string 3") 
f.close() 

는 :

string 3 
string 2 
string 1 

아니라 (이 코드가하는 것처럼) :

string 1 
string 2 
string 3 

답변

12

this question을 살펴보십시오. 거기에 몇 가지 솔루션이 있습니다.

아마 같은 방식으로 다니엘과 MAK 제안 있음을 갈 것 비록 - 어쩌면 상황이 좀 더 유연하고 명시 적으로 확인하기 위해 릴 '클래스를 만들 :

class Prepender: 

    def __init__(self, fname, mode='w'): 
     self.__write_queue = [] 
     self.__f = open(fname, mode) 

    def write(self, s): 
     self.__write_queue.insert(0, s) 

    def close(self): 
     self.__exit__(None, None, None) 

    def __enter__(self): 
     return self 

    def __exit__(self, type, value, traceback): 
     if self.__write_queue: 
      self.__f.writelines(self.__write_queue) 
     self.__f.close() 

with Prepender('test_d.out') as f: 
    f.write('string 1\n') 
    f.write('string 2\n') 
    f.write('string 3\n') 
7

는 각 쓰기 사이 f.seek(0)을 던져 (또는 쓸 수 당신을 위해 그것을 수행하는 래퍼 (wrapper) 함수). 그러나 이것을하기위한 간단한 방법은 없습니다.

EDIT : 거기에 f.flush()을 넣어도 계속 작동하지 않습니다. 쓰기를 대기열에 넣고 순서를 바꾸어야 할 수도 있습니다. 다니엘 DiPaolo의 답변에 부연

writeList = [] 
writeList.append("string 1\n") 
writeList.append("string 2\n") 
writeList.append("string 3\n") 
writeList.reverse() 
f.writelines(writeList) 
1

:

단순히 당신이 list에 기록 할 모든 라인을 추가

그래서 대신

f.write("string 1") 
f.write("string 2") 
f.write("string 3") 

아마 그런 짓을. list을 반대로 변환 한 다음 해당 내용을 파일에 씁니다.

f=open('output.txt','w') 

l=[] 
l.append("string 1") 
l.append("string 2") 
l.append("string 3") 

for line in l: 
    f.write(line) 

f.close() 

또한 deque를 사용할 수 있으며, 그것의 시작 대신 list를 사용하고 반전에 줄을 추가합니다.

+0

이 용도로 사용하면 로그 파일과 유사하여 연속 실행시 로그에 기록 될 수 있습니다. 메모리에 전체 파일을 저장하는 유일한 수단은 무엇입니까? 처음에 내용을 쓰고 이전 내용을 모두 따르십시오. (중간 파일 생성 제외) –

+0

Python의'file' 클래스에서 이와 같이 직접적으로 (즉, 일종의 중간 버퍼를 사용하지 않고) 허용하는 것을 전혀 알지 못합니다. 그래서, 지금은 가장 간단한 방법처럼 보입니다. 로그 파일의 경우 파일 끝에 최신 항목을 추가하기 만하면 훨씬 더 이해하기 쉽고 삶을 훨씬 단순하게 만들지 않겠습니까? – MAK

+0

@Nick, @MAK, Python에는 이것을 처리 할 수있는 것이 없으며 기본 C 라이브러리 또는 파일 시스템에는 아무 것도 없습니다. 이것은 단순히 파일이 작동하는 방식이 아니며, 콘텐츠를 복사하려고하지 않는 한 추가하는 것 이외의 파일을 성장시킬 수 없습니다. 새 파일을 사용하거나 이전 파일 내에서 데이터를 이동하여 수행 할 수 있지만 그 중 한 가지 방법은 잘못된 생각 일 가능성이 큽니다. 요구 사항을 변경하거나 문제를 보는 방식을 개선하십시오 ... –

1

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', 
     ] 
    ) 
관련 문제