Подготовить строку к началу файла
Я могу сделать это с помощью отдельного файла, но как добавить строку в начало файла?
f=open('log.txt','a')
f.seek(0) #get to the first position
f.write("text")
f.close()
Это начинает запись с конца файла, так как файл открывается в режиме добавления.
Ответы
Ответ 1
В режимах 'a'
или 'a+'
любая запись выполняется в конце файла, даже если в текущий момент, когда функция write()
запускается, указатель файла не находится в конце файла: перед записью указатель перемещается в конец файла. Вы можете делать то, что хотите, двумя способами.
1st way, можно использовать, если нет проблем с загрузкой файла в память:
def line_prepender(filename, line):
with open(filename, 'r+') as f:
content = f.read()
f.seek(0, 0)
f.write(line.rstrip('\r\n') + '\n' + content)
Второй способ:
def line_pre_adder(filename, line_to_prepend):
f = fileinput.input(filename, inplace=1)
for xline in f:
if f.isfirstline():
print line_to_prepend.rstrip('\r\n') + '\n' + xline,
else:
print xline,
Я не знаю, как этот метод работает под капотом и может ли он использоваться в большом большом файле. Аргумент 1, переданный на вход, позволяет переписать строку на место; следующие строки должны быть перемещены вперед или назад, чтобы операция inplace имела место, но я не знаю механизм
Ответ 2
Во всех файловых системах, с которыми я знаком, вы не можете делать это на месте. Вы должны использовать вспомогательный файл (который затем можно переименовать, чтобы взять имя исходного файла).
Ответ 3
Чтобы поставить код на ответ NPE, я думаю, что наиболее эффективным способом сделать это:
def insert(originalfile,string):
with open(originalfile,'r') as f:
with open('newfile.txt','w') as f2:
f2.write(string)
f2.write(f.read())
os.rename('newfile.txt',originalfile)
Ответ 4
Отличная идея:
(1) Вы сохраняете исходный файл как переменную.
(2) Вы перезаписываете исходный файл новой информацией.
(3) Вы добавляете исходный файл в данные ниже новой информации.
Код:
with open(<filename>,'r') as contents:
save = contents.read()
with open(<filename>,'w') as contents:
contents.write(< New Information >)
with open(<filename>,'a') as contents:
contents.write(save)
Ответ 5
Нет никакого способа сделать это с помощью каких-либо встроенных функций, потому что это было бы ужасно неэффективно. Вам нужно будет переместить существующее содержимое файла каждый раз, когда вы добавите строку спереди.
Здесь есть утилита Unix/Linux tail
, которая может считываться с конца файла. Возможно, вы можете найти это полезным в своем приложении.
Ответ 6
num = [1, 2, 3] #List containing Integers
with open("ex3.txt", 'r+') as file:
readcontent = file.read() # store the read value of exe.txt into
# readcontent
file.seek(0, 0) #Takes the cursor to top line
for i in num: # writing content of list One by One.
file.write(str(i) + "\n") #convert int to str since write() deals
# with str
file.write(readcontent) #after content of string are written, I return
#back content that were in the file
Ответ 7
Простой способ сделать это заключается в следующем, если вы не возражаете написать файл снова
with open("a.txt", 'r+') as fp:
lines = fp.readlines() # lines is list of line, each element '...\n'
lines.insert(0, one_line) # you can use any index if you know the line index
fp.seek(0) # file pointer locates at the beginning to write the whole file again
fp.writelines(lines) # write whole lists again to the same file
Обратите внимание, что это не замена на месте. Он снова пишет файл.
Таким образом, вы читаете файл и сохраняете его в список, изменяете список и снова записываете список в новый файл с тем же именем файла.