복붙노트

[PYTHON] 파일의 시작 부분에 write ()?

PYTHON

파일의 시작 부분에 write ()?

나는 지금 이렇게하고 있지만 파일의 시작 부분에 쓰기를 원한다.

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

out.txt의 내용은 다음과 같습니다.

string 3
string 2
string 1

그리고 (이 코드처럼) :

string 1
string 2
string 3

해결법

  1. ==============================

    1.이 질문을보십시오. 거기에 몇 가지 솔루션이 있습니다.

    이 질문을보십시오. 거기에 몇 가지 솔루션이 있습니다.

    Daniel과 MAK가 제안한 것과 같은 방식으로 아마 갈 것입니다. 아마도 lil 클래스를 만들어서 좀 더 유연하고 명료하게 만들 수있을 것입니다.

    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')
    
  2. ==============================

    2.각 쓰기 사이에 f.seek (0)을 던질 수도 있고 (또는 당신을 위해 그것을 수행하는 래퍼 함수를 ​​작성), 그렇게하기위한 간단한 방법은 없습니다.

    각 쓰기 사이에 f.seek (0)을 던질 수도 있고 (또는 당신을 위해 그것을 수행하는 래퍼 함수를 ​​작성), 그렇게하기위한 간단한 방법은 없습니다.

    편집 : f.flush () 넣어 경우에도이 작동하지 않습니다, 계속 덮어 씁니다. 쓰기를 대기열에 넣고 순서를 바꾸어야 할 수도 있습니다.

    그래서 대신

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

    어쩌면 다음과 같이 할 수 있습니다.

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

    3.Daniel DiPaolo의 대답에 대해 자세히 설명합니다.

    Daniel DiPaolo의 대답에 대해 자세히 설명합니다.

    쓸 줄 모든 줄을 목록에 추가하기 만하면됩니다. 목록을 역순으로 만들고 내용을 파일에 씁니다.

    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()
    

    목록을 사용하고 역순으로 사용하는 대신 처음에 양키를 사용하고 줄을 추가 할 수도 있습니다.

  4. ==============================

    4.kdtrv의 답변에 대한 변형입니다. 이 버전은 기존 파일 내용을 유지하고 라인 순서를 유지하는 write_lines 메소드를 제공합니다.

    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',
            ]
        )
    
  5. from https://stackoverflow.com/questions/2677617/write-at-beginning-of-file by cc-by-sa and MIT license