2016-06-24 3 views
0

Я пытаюсь удалить определенные строки в текстовом файле, как мне нужно, - попросить пользователя ввести строку (фраза, которая должна существовать в файле), затем выполняется поиск файла, и если строка содержит данные в этой строке и номер номера номера, они сохраняются.Найдите конкретную строку в файле на основе ввода пользователя, а затем удалите определенное количество строк.

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

Любые идеи относительно того, как я могу удалить эти шесть строк?

Это была моя последняя попытка удалить строки

file = open('C:\\test\\example.txt', 'a') 
locate = "example string" 
for i, line in enumerate(file): 
    if locate in line: 
     line[i] = line.strip() 
     i = i+1 

     line[i] = line.strip() 
     i = i+1 

     line[i] = line.strip() 
     i = i+1 

     line[i] = line.strip() 
     i = i + 1 

     line[i] = line.strip() 
     i = i+1 

     line[i] = line.strip() 
     break 
+0

Не пытайтесь изменить исходный файл. Просто скопируйте материал, который хотите сохранить в новом файле. –

+0

Вы не запустили этот код, не так ли? :-) – handle

+0

Я запустил код, поэтому я пришел сюда, я знаю, что он не работает, это был пример того, чего я пытался достичь и не смог: :) – Afflicted

ответ

1

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

with open('source.txt', 'r') as ifile: 
    with open('output.txt', 'w') as ofile: 
     locate = "example string" 
     skip_next = 0 
     for line in ifile: 
      if locate in line: 
       skip_next = 6 
       print(line.rstrip('\n')) 
      elif skip_next > 0: 
       print(line.rstrip('\n')) 
       skip_next -= 1 
      else: 
       ofile.write(line) 

Это также относится к поиску фразы несколько раз - она ​​только начинает отсчет строк, чтобы снова удалить их.

+0

Сохраните строки! 'with open() как ifile, open() asilile:' – handle

0

Вы добавляете к своему файлу, используя open с 'a'. Кроме того, вы не закрываете свой файл (плохая привычка). str.strip() не удаляет строку, она удаляет пробелы по умолчанию. Кроме того, это обычно делается в цикле.

Это для начала работы:

locate = "example string" 
n=0 
with open('example.txt', 'r+') as f: 
    for i,line in enumerate(f): 
     if locate in line: 
      n = 6 
     if n: 
      print(line, end='') 
      n-=1 

print("done") 

Edit:

решения

Read-модификации-записи:

locate = "example string" 
filename='example.txt' 
removelines=5 
with open(filename) as f: 
    lines = f.readlines() 
with open(filename, 'w') as f: 
    n=0 
    for line in lines: 
     if locate in line: 
      n = removelines+1 
     if n: 
      n-=1 
     else: 
      f.write(line) 
0

Вы можете найти вхождение, копировать элементы списка между вхождениями в новый список, а затем сохраните новый список в файле.

_newData = [] 
_linesToSkip = 3 

with open('data.txt', 'r') as _file: 
    data = _file.read().splitlines() 
    occurrences = [i for i, x in enumerate(data) if "example string" in x] 

    _lastOcurrence = 0 
    for ocurrence in occurrences: 
     _newData.extend(data[_lastOcurrence : ocurrence]) 
     _lastOcurrence = ocurrence + _linesToSkip 
    _newData.extend(data[_lastOcurrence:]) 

    # Save new data into the file 
0

Есть несколько моментов, которые вы четко поняли здесь:

.strip() удаляет пробельные или данные символы:

>>> print(str.strip.__doc__) 
S.strip([chars]) -> str 

Return a copy of the string S with leading and trailing 
whitespace removed. 
If chars is given and not None, remove characters in chars instead. 

приращением i на самом деле ничего не делают:

>>> for i, _ in enumerate('ignore me'): 
... print(i) 
... i += 10 
... 
0 
1 
2 
3 
4 
5 
6 
7 
8 

Вы назначаете i-й элемент линии, которая должна поднять исключение (что вы пренебрегли рассказать нам о)

>>> line = 'some text' 
>>> line[i] = line.strip() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'str' object does not support item assignment 

В конечном счете ...

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

search_string = 'example' 
lines = [] 
with open('/tmp/fnord.txt', 'r+') as f: #`r+` so we can read *and* write to the file 
    for line in f: 
     line = line.strip() 
     if search_string in line: 
      print(line) 
      for _ in range(5): 
       print(next(f).strip()) 
     else: 
      lines.append(line) 
    f.seek(0)  # back to the beginning! 
    f.truncate() # goodbye, original lines 
    for line in lines: 
     print(line, file=f) # python2 requires `from __future__ import print_function` 

Существует фатальный недостаток в таком подходе, хотя - если желаемая линия ближе, чем 6-й линии от конца, он будет иметь проблемы. Я оставлю это как упражнение для читателя.

Смежные вопросы