написать () в начале файла? - PullRequest
18 голосов
/ 20 апреля 2010

Я делаю это сейчас так, но вместо этого я хочу, чтобы это записывалось в начале файла.

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

Ответы [ 4 ]

13 голосов
/ 20 апреля 2010

Взгляните на этот вопрос . Там есть несколько решений.

Хотя я бы, вероятно, пошел бы тем же путем, что предлагают Дэниел и 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 голосов
/ 20 апреля 2010

Вы можете бросить 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)
2 голосов
/ 27 декабря 2013

Вариант ответа 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',
        ]
    )
1 голос
/ 20 апреля 2010

Обработка ответа Даниэля ДиПаоло:

Просто добавьте все строки, которые вы хотите записать в list. Переверните 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 и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...