Подтвердить что ты не робот

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
4b9b3361

Ответ 1

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

Хотя я, вероятно, пойдет так же, как Даниэль и 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

Вы можете отправить 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

Разрабатывая ответ Даниэля Ди Паоло:

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

Ответ 4

Вариант ответа 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',
        ]
    )