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

Пытаюсь удалить из файла.

Это то, что я пытаюсь сделать.

1. импорт Easygui

2. поставить три режима плюс выход

  1. 3 режима (посмотреть, добавить, удалить)

Все работает, кроме удаления части. это то, что у меня есть

    import easygui

    filea = open('GroceryList.txt', 'a')
    fr = open('GroceryList.txt', 'r')
    filer = open('GroceryList.txt', 'r')

    runinng = True
    while runinng:
      a = easygui.choicebox('Do you want to add, delete, or see your list?',
                    choices = ['add', 'delete', 'see', 'quit'])
     if a == 'add':
       ad = easygui.enterbox('What do you want to add')
       filea.write(ad)
       filea.write('\n')
    filea.close()
    filea = open('GroceryList.txt', 'a')


    elif a == 'delete':
       rn = easygui.enterbox('What are you going to delete?')
       rl = fr.readlines()
       for lines in fr:
         if rn in lines:
           line.split()
         fr.close()
         fr = open('GroceryList.txt', 'r')


   elif a == 'see':
     s = filer.readlines()
     easygui.msgbox(s)
   filer.close()
   filer = open('GroceryList.txt', 'r')

   elif a == 'quit':
    runinng = False
  filea.close()
  fr.close()
  filer.close()

Часть, которая не работает:

    elif a == 'delete':
rn = easygui.enterbox('What are you going to delete?')
rl = fr.readlines()
if rn in fr:
  line.remove()
fr.close()
fr = open('GroceryList.txt', 'r')

Вам нужно открыть файл новый с доступом на запись (w). Зациклить чтение каждой строки из оригинала и записать строку, если она не та, которую нужно удалить. Закройте оба файла, затем переименуйте новый файл, чтобы он совпадал со старым. Немного мучительно, но именно это произойдет, если вы используете текстовый файл вместо базы данных.

cdarke 10.08.2018 14:35

Строку лучше всего удалить из файла следующим образом: 1 прочитать все строки из файла в список, 2 удалить одну строку из списка, 3 снова открыть файл, на этот раз для записи, и записать в него оставшиеся строки

zvone 10.08.2018 14:36

Спасибо за совет, но ... я не понимаю. Вы можете показать мне сценарий?

Death 10.08.2018 14:43
1
3
130
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

fr = open('GroceryList.txt', 'r')
rl = fr.readlines()
new_list_to_keep_rows=[]
for row in rl:
    #add rows to keep
    new_list_to_keep_rows.append(row) 

new_file = open('GroceryList_new.txt', 'w')# open file in write mode
for item in new_list_to_keep_rows:
    new_file.write("%s\n" % item)

переименуйте файл, когда будете уверены, что у вас все есть.

Спасибо, но у меня возникла ошибка: Traceback (последний вызов последний): файл «C: / Python27 / Hello world / editGroceryList.py», строка 26, в <module> new_list_to_keep_rows.add (row) AttributeError: объект 'list' имеет нет атрибута "добавить"

Death 10.08.2018 17:57

Новости: ошибок нет, но не работает. Сожалею. :( но хорошая работа

Death 10.08.2018 18:04

У кого-нибудь есть простой скрипт?

Death 10.08.2018 18:13

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

mad_ 10.08.2018 18:16

Я заметил одну вещь в вашем коде:

импорт easygui

filea = open('GroceryList.txt', 'a')
fr = open('GroceryList.txt', 'r')
filer = open('GroceryList.txt', 'r')

runinng = True
while runinng:
  a = easygui.choicebox('Do you want to add, delete, or see your list?',
                choices = ['add', 'delete', 'see', 'quit'])
 if a == 'add':  # Here number of spaces from line starting to `if` is 5, see next note to error
   ad = easygui.enterbox('What do you want to add')
   filea.write(ad)
   filea.write('\n')
filea.close()
filea = open('GroceryList.txt', 'a')


elif a == 'delete':  # Here number of spaces from line starting to `elif` is 4, but before it was 5, maybe this is error
   rn = easygui.enterbox('What are you going to delete?')
   rl = fr.readlines()
   for lines in fr:
       if rn in lines:
           line.split()
       fr.close()
       fr = open('GroceryList.txt', 'r')  # here 'r' is read permission, but for editing you need 'w' writing permision


elif a == 'see':  # And here number of spaces are 3.
  s = filer.readlines()
  easygui.msgbox(s)
  filer.close()
  filer = open('GroceryList.txt', 'r')

 elif a == 'quit':
  runinng = False
filea.close()
fr.close()
filer.close()

Итак, ваш код будет:

import easygui

filea = open('GroceryList.txt', 'a')
fr = open('GroceryList.txt', 'r')
filer = open('GroceryList.txt', 'r')

runinng = True
while runinng:
    a = easygui.choicebox('Do you want to add, delete, or see your list?',
        choices = ['add', 'delete', 'see', 'quit'])
if a == 'add':
    ad = easygui.enterbox('What do you want to add')
    filea.write(ad)
    filea.write('\n')
    filea.close()
    filea = open('GroceryList.txt', 'a')


elif a == 'delete':
    rn = easygui.enterbox('What are you going to delete?')
    rl = fr.readlines()
    for lines in fr:
        if rn in lines:
            line.split()
        fr.close()
        fr = open('GroceryList.txt', 'w')

elif a == 'see':
    s = filer.readlines()
    easygui.msgbox(s)
    filer.close()
    filer = open('GroceryList.txt', 'r')

elif a == 'quit':
    runinng = False
    filea.close()
    fr.close()
    filer.close()

Итак, ошибка заключается в количестве spaces и разрешениях.

Не могли бы вы вкратце объяснить, в чем была проблема и как ее исправить до появления больших фрагментов кода?

Bob 20.07.2019 20:45

Я думаю, что проблема заключалась в количестве пробелов, а также в настройках разрешений.

UltraStudioLTD 20.07.2019 21:07

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

UltraStudioLTD 20.07.2019 21:13

Другие вопросы по теме