Я на самом деле следую подобному правилу для своего собственного кода, но только из-за печати кода к странице A4 - 80 столбцов о правильной ширине для моего желаемого размера шрифта.
, Но это - персональное предпочтение и вероятно не, чем Вы были после (так как Вы хотите, чтобы боеприпасы пошли другим путем).
, Что не делает Вас, подвергают сомнению обоснование позади предела - серьезно, если никто не может придумать серьезное основание, почему это так, у Вас есть хороший случай для того, чтобы удалить его из Ваших стандартов кодирования.
Вы можете использовать приведенный выше код, а затем: -
lines = file.readlines()
lines = lines[:-1]
Это даст вам массив строк, содержащий все строки, кроме последней.
Это не использует python, но python - неподходящий инструмент для работы, если это единственная задача, которую вы хотите. Вы можете использовать стандартную утилиту * nix head
и запустить
head -n-1 filename > newfile
, которая скопирует всю строку имени файла, кроме последней, в новый файл.
Предполагая, что вам нужно сделать это на Python и у вас есть большой файла достаточно, чтобы нарезки списка было недостаточно, вы можете сделать это за один проход по файлу:
last_line = None
for line in file:
if last_line:
print last_line # or write to a file, call a function, etc.
last_line = line
Не самый элегантный код в мире, но он выполняет свою работу.
Обычно он буферизует каждую строку в файла через переменную last_line, каждая итерация выводит строку предыдущих итераций.
В системах, где работает file.truncate () , вы можете сделать что-то вроде этого:
file = open('file.txt', 'rb')
pos = next = 0
for line in file:
pos = next # position of beginning of this line
next += len(line) # compute position of beginning of next line
file = open('file.txt', 'ab')
file.truncate(pos)
Согласно моим тестам, file.tell () не работает при чтении построчно, предположительно из-за того, что его запутывает буферизация. Вот почему для определения позиций складываются длины линий. Обратите внимание, что это работает только в системах, в которых разделитель строк заканчивается на '\ n'.
Хотя я не тестировал его (пожалуйста, не надо этого ненавидеть), я считаю, что есть более быстрый способ сделать это. Это скорее решение на языке C, но вполне возможно в Python. Это тоже не Pythonic. Я бы сказал, что это теория.
Во-первых, вам нужно знать кодировку файла. Задайте для переменной количество байтов, которое использует символ в этой кодировке (1 байт в ASCII). CHARsize (почему бы и нет). Вероятно, будет 1 байт с файлом ASCII.
Затем выберите размер файла и установите для него FILEsize .
Предположим, у вас есть адрес файла (в памяти) в FILEadd .
Добавить FILEsize к FILEadd .
Переместите обратные слова (с увеличением на -1 *** CHARsize **), проверяя каждый байт CHARsize на наличие \ n (или любого другого символа новой строки, используемого вашей системой). Когда вы дойдете до первого \ n, теперь у вас будет позиция начала первой строки файла. Замените \ n на \ x1a (26, ASCII для EOF или что-то еще в вашей системе / с кодировкой).
Очистите, как вам нужно (измените размер файла, коснитесь файла).
Если это сработает так, как я подозреваю, вы сэкономите много времени, поскольку вам не нужно читать весь файл с самого начала, вы читаете с конца.
Не нужно читать весь файл с начала, вы читаете с конца. Не нужно читать весь файл с начала, вы читаете с конца.вот другой способ, не заглатывая весь файл в память
p=""
f=open("file")
for line in f:
line=line.strip()
print p
p=line
f.close()
Вот более общее решение с эффективным использованием памяти, позволяющее пропускать последние n строк (например, команда head
):
import collections, fileinput
def head(filename, lines_to_delete=1):
queue = collections.deque()
lines_to_delete = max(0, lines_to_delete)
for line in fileinput.input(filename, inplace=True, backup='.bak'):
queue.append(line)
if lines_to_delete == 0:
print queue.popleft(),
else:
lines_to_delete -= 1
queue.clear()