Удаление одной строки в файле - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь вставить несколько строк в файл news.php. Эти строки вставляются при редактировании файла list.php внутри <li>. Но когда я вставляю это updates в news.php, оно становится слишком большим, поэтому я хотел бы сохранить только последние пять обновлений из list.php И при шестикратном обновлении я хотел бы удалить самое старое. Я искал удаление в файлах для определенной строки, но это показало мне только способ с режимом файлов w, где я могу перезаписать весь текст, кроме этой одной строки. Я попробовал, но в коде было слишком много циклов, и его стало очень трудно читать и понимать. Я ищу хороший подход, где я могу удалить 10-ю строку из файла, когда количество строк> 15. Кстати. Я хочу оставить там строки от 1 до 10 в news.php, потому что они являются html строками для файла. От 10 до ниже формат такой же, так что я смог поймать его с помощью регулярных выражений, таких как pattern = r"<a href='(.*)'>(.*)</a><br>", если это могло бы помочь ... Мой код ниже. base var - это файл, перехваченный перед обновлением (по звездочкам программы), поэтому я могу сравнить его в цикле и считать обновления в файле list.php.


http = []
lines = []
pattern = r"<a href='(.*)'>(.*)</a><br>"

while base != None:
    sleep(2)
    try:
        with open('list.php', 'r') as f:
            webpage = f.read()
        html_soup = BeautifulSoup(webpage, "html.parser")
        for li in html_soup.find_all('li'): # Getting updated lines from `list.php`
            a_text = li.find('a').contents[0] # And constructing a string to send it to `news.php`
            a_text = a_text.replace(u'\xa0', u'')
            a_link = (li.find('a')['href'])
            full_address = a_link + " " + a_text
            if full_address not in base:
                url, name = full_address.split(" ")
                address = f"<a href='{url}'>{name}</a><br>"
                with open('news.php', 'a') as phpfile:  # I'm writing updates(new lines in <li> to the file)
                    phpfile.write(address + "\n")
                base.append(full_address) # Save updated lines, so it wont repeat

                with open('news.php', 'r') as phpfile: # Catching <li> string with `re` and `html` content
                    phpfile.seek(0)
                    for line in phpfile:
                        if re.match(pattern, line):
                         lines.append(line)
                    else:
                        http.append(line)

    except Exception as e:
        print(e)
        continue

1 Ответ

0 голосов
/ 11 октября 2019

Я не уверен, для чего нужен весь другой код, если вы просто хотите удалить 10-ую строку из файла. Тем не менее, я написал эти два примера двух методов, которые вы можете использовать. Обратите внимание, что это только общие примеры. Вы должны исправить их в своем случае использования и на какую версию системы, платформы или Python вы нацеливаетесь.

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

Метод 1: Таким образом, если вы хотите избавиться от 10-й строки. Получить позицию, где находится 10 линия. Прочитайте все после строки 10 и сохраните это в строку. Обрежьте файл до конца 9-й строки. Добавьте что-нибудь после десятого после усечения файла.

fileName = "test.txt"
line10start = -1
line11start = -1
morethan15 = 0

f = open(fileName, "r")
for i in range(0,16):
  if ( f.readline() == "" ):
    break;
  if ( i == 8 ):
    line10start = f.tell()
  if ( i == 9 ):
    line11start = f.tell()
  if ( i == 15 ):
    morethan15 = 1
if ( morethan15 == 1 ):
  f.seek(line11start)
  contentAfter10 = f.read()
f.close()

if ( morethan15 == 1 ):
  with open(fileName, 'a') as f: 
    f.seek(line10start);
    f.truncate();
    f.write(contentAfter10)

Метод 2: Просто прочитайте весь файл в список. Если его длина больше 15, удалите десятый индекс и запишите его обратно в файл. В конечном итоге вам не нужно использовать pop (), вы можете просто присвоить индексу 9 пустую строку.

fileName = "test.txt"
fileContent = []

with open(fileName, 'r') as f: 
  fileContent = f.readlines()

if ( len(fileContent) > 15 ):
  fileContent.pop(9)
  with open(fileName, 'w') as f: 
    f.write("".join(fileContent))

test.txt content:

this is line 1c
this is line 2c
this is line 3c
this is line 4c
this is line 5c
this is line 6c
this is line 7c
this is line 8c
this is line 9c
this is line 10c
this is line 11c
this is line 12c
this is line 13c
this is line 14c
this is line 15c
this is line 16c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...