2016-03-25 6 views
1

В настоящее время я создаю скрипт для школьной работы, который будет иметь множество функций, но тот, на который я застрял, - это функция удаления. В принципе, что ему нужно сделать, это удалить строку, пользователь желает из 10 строк, что есть (мы можем разрешить только 10 строк написано так, например, если документ имеет:.Удаление строки из текстового документа

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

и Я стараюсь удалить 8, было бы переписать так:.

1 
2 
3 
4 
5 
6 
7 
9 
10 

Мой текущий код здесь

elif action1 == '2': 
    linetoremove = input('What line would you like to remove? (1 up to 10)') 
    with open('highscore.txt', 'r') as fin: 
     data = fin.read().splitlines(True) 
    with open('highscore.txt', 'w') as fout: 
     fout.writelines(data[int(linetoremove)]:) 

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

Благодаря Conn

+0

Заметим, что 'данные [Int (linetoremove)]:' 'должны быть данные [Int (linetoremove):]', иначе ваш код поднимает 'SyntaxError' , –

ответ

2

Массивы (список и кортеж) в питоне начинается с индексом 0, не 1. Вот почему ваш код кажется удалять первую строку, когда пользователь вводит «1». Как написано, ваш код печатает только строку с индексом linetoremove.

linetoremove = input('What line would you like to remove? (1 up to 10)') 
with open('highscore.txt', 'r') as fin: 
    data = fin.read().splitlines(True) 
del data[int(linetoremove)-1] 
with open('highscore.txt', 'w') as fout: 
    fout.writelines(data) 

Вы также можете проверить введенное значение.

0

Используйте enumerate перебирать каждую строку текста, а также получить свою позицию в файле:

with open('highscore.txt', 'w') as fout: 
    for line_number, line in enumerate(data): 
     if line_number != int(linetoremove): 
      fout.write(line) 
+0

@ ConnB-M Вы определили 'данные' в своем вопросе ...' data = fin.read() ' –

0

Не следует просить ответа на домашнюю работу здесь, но я чувствую себя любезно! Не самый эффективный или быстрый, но я подумал, что он продемонстрирует вам лучшие шаги!

def removeLine(line, file): 
    f1 = open(file, 'rb').readlines() #Creates a list of the lines in the file, automatically closes file 
    try: 
     del f1[line-1] #Attempt to delete the line at index 
    except: 
     print 'Line %s does not exist in %s'%(line, file) #Print and return if it cannot 
     return 
    f2 = open(file, 'wb') #open new instance of the file in write mode 
    for i in f1: 
     f2.write(i) #write to the file 
    f2.close() #Close file 

removeLine(5, 'data') 
-1
del_line = input('What line would you like to remove (1 up to 10)? ') 
lines = open('highscore.txt').readlines() 
open('highscore.txt', 'w').writelines(lines[del_line:-1]) 
+0

Почему downvote? – avip

0

Чтобы понять, почему ваш код не работает, вы можете прочитать на list slicing in Python.

Предположим, что пользователь вводит «4» в качестве номера строки для удаления, это приводит к отправке следующего фрагмента на ваш writelines.

data[4:] 

Мы можем видеть, что это делает в следующем примере.

data = [0, 1, 2, 3, 4, 5, 6, 7, 8] 
data[4:] # [4, 5, 6, 7, 8] 

Короче говоря, он возвращает список всех значений в data с индексом, большим или равным 4. (Обратите внимание, что первый элемент имеет индекс 0.)

Это может быть объединен с вспомогательным срез для выполнения операции удаления.

data = [0, 1, 2, 3, 4, 5, 6, 7, 8] 
data[:3] + data[4:] # [0, 1, 2, 4, 5, 6, 7, 8] 

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

index = int(linetoremove) - 1 
fout.writelines(data[:index] + data[index+1:]) 
Смежные вопросы