Эффективный способ удалить строки из файла в Python (и сохранить то же имя файла)? - PullRequest
4 голосов
/ 13 мая 2011

Моя программа ведет журнал для пользователя.Если журнал когда-либо становится больше установленного количества, я хочу удалить первые 20% строк.

Из похожих вопросов я видел предложения прочитать в старом файле и выписать всеСтроки, которые я хочу сохранить в новом файле.Однако мои файлы могут быть слишком большими, чтобы их можно было постоянно читать, и использование этого метода не позволило бы мне сохранить одно и то же имя файла.

Можно ли удалить строки из файла без чтения в моем старом файле?

Ответы [ 3 ]

8 голосов
/ 13 мая 2011

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

Что касается вашего вопроса: вы можете обрезать только сзади, а не с самого начала. Примерным решением было бы искать () 20% файла, сначала найти '\ n' и скопировать его - но это будет медленно и склонно к гоночным условиям. Перейти с регистрации и RotatingFileHandler.

1 голос
/ 13 мая 2011

Как уже говорили другие, традиционный способ решения этой проблемы - сохранить 5 разных файлов вместо 1 большого. Если вам нужно удалить 20%, просто удалите самый старый файл и переименуйте остальные.

Как бы удобны ни были текстовые файлы, вы также можете рассмотреть базу данных. Он предназначен для возможности удаления любой части данных в любое время.

0 голосов
/ 13 мая 2011
if size > MAX_SIZE:
    f = open(your_file, 'r')
    lines = f.readlines()
    f.close()

    f = open(your_file, 'w')
    f.write('\n'.join(lines[len(lines)/5:]))
    f.close()

Это могло бы сделать это. Хотя, как сказали первые два, гораздо лучше использовать несколько файлов или даже БД, если вы можете. Этот код не проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...