Привет, есть файл numbers.txt, в котором записаны следующие элементы
+1 +1 +1 +1
Как удалить последний +1. Буду благодарен, если кто-то напишет как это сделать.
Привет, есть файл numbers.txt, в котором записаны следующие элементы
+1 +1 +1 +1
Как удалить последний +1. Буду благодарен, если кто-то напишет как это сделать.
Чтобы вырезать только последнее вхождение +1, не трогая другое содержимое, которое после него может идти, можно использовать подходы из Как заменить строчку в .txt файле через python 3? К примеру, для маленьких файлов, используя срезы строк:
#!/usr/bin/env python3
from pathlib import Path
text = Path('файл.txt').read_text() # read
# cut
item = '+1'
i = text.rindex(item) # last occurrence
text = text[:i] + text[i + len(item):]
Path('результат.txt').write_text(text) # write
Как по ссылками показано, не обязательно всё содержимое файла в память читать, к примеру, можно читать построчно. Можно даже читать с конца файла только до нужного места и выполнить аналог memmove(i, i + len(item)), что можно реализовать с помощью временного файла или read(chunk_size)/tell()/seek() методов.
Если после +1 ничего не нужно сохранить в файле. Можно найти последнее вхождение +1 в файле и обрезать (truncate) файл в этом месте:
with open('файл.txt', 'r+b') as file:
i = find_last_occurence_fp(file, b'+1')
file.truncate(i)
где
import io
import os
def find_last_occurence_fp(file, item, bufsize=io.DEFAULT_BUFFER_SIZE):
size, s = bufsize, b''
while item not in s:
try:
file.seek(-size, os.SEEK_END)
except IOError: # file is too small
file.seek(0) # rewind to beginning
break
finally:
s = file.read(size)
size *= 2 # avoid quadratic behavior
return s.rindex(item)
find_last_occurence_fp() реализована по аналогии с упомянутой last_line() функцией, поэтому к ней применимы те же замечания о производительности.
Если элемент может быть далеко от конца файла очень большого файла, то чтобы в память не загружать лишнего, можно использовать реализацию аналогичную last_line() на основе mmap, не накапливая лишние данные в буфере.
Написал построчно и с примерами данных, поэтому думаю будет понятно:
# Считать из файла
with open('numbers.txt') as f:
text = f.read() # '+1 +1 +1 +1'
items = text.split() # ['+1', '+1', '+1', '+1']
Записать в файл
with open('numbers.txt', mode='w') as f:
items = items[:-1] # ['+1', '+1', '+1']
text = ' '.join(items) # '+1 +1 +1'
f.write(text)
Кроме того, удалить элементы из списка можно через метод pop, например:
...
items = text.split() # ['+1', '+1', '+1', '+1']
items.pop() # '+1'
items # ['+1', '+1', '+1']
...
In [21]: # открываем файл на чтение
...: with open('document.txt') as file:
...: # считываем содержимое файла
...: # делаем из него список с помощью функции split()
...: # обрезаем последний элемент [:-1]
...: old_content = file.read().split()[:-1] # ['+1', '+1', '+1']
...: # открываем файл на перезапись
...: with open('document.txt', 'w') as update:
...: # делаем из списка строку
...: # разделяем её содержимое пробелами функцией ' '.join()
...: # записываем в файл результат
...: update.write(' '.join(old_content)) # '+1 +1 +1'