Удалите заключительную строку в файле с Python

Я на самом деле следую подобному правилу для своего собственного кода, но только из-за печати кода к странице A4 - 80 столбцов о правильной ширине для моего желаемого размера шрифта.

, Но это - персональное предпочтение и вероятно не, чем Вы были после (так как Вы хотите, чтобы боеприпасы пошли другим путем).

, Что не делает Вас, подвергают сомнению обоснование позади предела - серьезно, если никто не может придумать серьезное основание, почему это так, у Вас есть хороший случай для того, чтобы удалить его из Ваших стандартов кодирования.

30
задан jchanger 21 February 2017 в 18:22
поделиться

7 ответов

Вы можете использовать приведенный выше код, а затем: -

lines = file.readlines()
lines = lines[:-1]

Это даст вам массив строк, содержащий все строки, кроме последней.

13
ответ дан 27 November 2019 в 23:08
поделиться

Это не использует python, но python - неподходящий инструмент для работы, если это единственная задача, которую вы хотите. Вы можете использовать стандартную утилиту * nix head и запустить

head -n-1 filename > newfile

, которая скопирует всю строку имени файла, кроме последней, в новый файл.

6
ответ дан 27 November 2019 в 23:08
поделиться

Предполагая, что вам нужно сделать это на 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, каждая итерация выводит строку предыдущих итераций.

4
ответ дан 27 November 2019 в 23:08
поделиться

В системах, где работает 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'.

3
ответ дан 27 November 2019 в 23:08
поделиться

Хотя я не тестировал его (пожалуйста, не надо этого ненавидеть), я считаю, что есть более быстрый способ сделать это. Это скорее решение на языке C, но вполне возможно в Python. Это тоже не Pythonic. Я бы сказал, что это теория.

Во-первых, вам нужно знать кодировку файла. Задайте для переменной количество байтов, которое использует символ в этой кодировке (1 байт в ASCII). CHARsize (почему бы и нет). Вероятно, будет 1 байт с файлом ASCII.

Затем выберите размер файла и установите для него FILEsize .

Предположим, у вас есть адрес файла (в памяти) в FILEadd .

Добавить FILEsize к FILEadd .

Переместите обратные слова (с увеличением на -1 *** CHARsize **), проверяя каждый байт CHARsize на наличие \ n (или любого другого символа новой строки, используемого вашей системой). Когда вы дойдете до первого \ n, теперь у вас будет позиция начала первой строки файла. Замените \ n на \ x1a (26, ASCII для EOF или что-то еще в вашей системе / с кодировкой).

Очистите, как вам нужно (измените размер файла, коснитесь файла).

Если это сработает так, как я подозреваю, вы сэкономите много времени, поскольку вам не нужно читать весь файл с самого начала, вы читаете с конца.

Не нужно читать весь файл с начала, вы читаете с конца.

Не нужно читать весь файл с начала, вы читаете с конца.

0
ответ дан 27 November 2019 в 23:08
поделиться

вот другой способ, не заглатывая весь файл в память

p=""
f=open("file")
for line in f:
    line=line.strip()
    print p
    p=line
f.close()
0
ответ дан 27 November 2019 в 23:08
поделиться

Вот более общее решение с эффективным использованием памяти, позволяющее пропускать последние 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()
0
ответ дан 27 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: