Я делаю его как это теперь, но я хочу, чтобы это записало в начале файла вместо этого.
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
Взгляните на этот вопрос . Там есть какие-то решения.
Хотя я, вероятно, пошел бы по тому же пути, что предлагают Дэниел и МАК - возможно, сделайте класс 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')
Вы можете бросать 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)
Доработка ответа Даниэля ДиПаоло:
Просто добавьте все строки, которые вы хотите записать, в список
. Переверните список
и запишите его содержимое в файл.
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()
Вы также можете использовать двухстороннюю очередь
и добавлять строки в ее начале вместо использования списка
и его перестановки.