2016-10-13 7 views
0

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

"Thermal Molecular Movement in , Order and Probability"

"Molecular and Ionic Interactions as the Basis for the Formation"

"Interfacial Phenomena and Membranes"

Моя первая попытка в следующим образом:

mystring = file.read() 
mystring=mystring.strip("Molecular Structure of Biological Systems") 
mystring=mystring.strip("Thermal Molecular Movement in , Order and Probability") 
mystring=mystring.strip("Molecular and Ionic Interactions as the Basis for the Formation") 
mystring=mystring.strip("Interfacial Phenomena and Membranes") 

new_file=open("no_refs.txt", "w") 

new_file.write(mystring) 

file.close() 

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

>>> "Hello this is a sentence. Please read it".strip("Please read it") 
'Hello this is a sentence.' 

Как выше не работает, я попытался следующие вместо:

file=open("novel.txt", "r") 
mystring = file.readlines() 
for lines in mystring: 
    if "Thermal Molecular Movement in , Order and Probability" in lines: 
     mystring.replace(lines, "") 
    elif "Molecular and Ionic Interactions as the Basis for the Formation" in lines: 
     mystring.replace(lines, "") 
    elif "Interfacial Phenomena and Membranes" in lines: 
     mystring.replace(lines, "") 
    else: 
     continue 

new_file=open("no_refs.txt", "w") 

new_file.write(mystring) 
new_file.close() 
file.close() 

Но для этой попытки я получаю эту ошибку:

TypeError: ожидается строка или другой буфер символов объекта

ответ

2
  • Первый str.strip() удаляет шаблон, если найден в старте или конец строки, которая объясняет, что она работает в вашем тесте, но на самом деле это не то, что вы хотите.
  • Во-вторых, вы пытаетесь выполнить замену в списке не на текущей строке (и вы не назначите назад результат замены)

Вот исправленную версию, которая успешно снимает узорах линии:

with open("novel.txt", "r") as file: 
    mystring = file.readlines() 
    for i,line in enumerate(mystring): 
     for pattern in ["Thermal Molecular Movement in , Order and Probability","Molecular and Ionic Interactions as the Basis for the Formation","Interfacial Phenomena and Membranes"]: 
      if pattern in line: 
       mystring[i] = line.replace(pattern,"")      

    # print the processed lines 
    print("".join(mystring)) 

Обратите внимание на enumerate конструкцию, которая позволяет выполнить итерации по значениям & индекса. Итерация только по значениям позволит найти шаблоны, но не изменять их в исходном списке.

Также обратите внимание на конструкцию with open, которая закрывает файл, как только вы покидаете блок.

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

with open("novel.txt", "r") as file: 
    mystring = file.readlines() 
    pattern_list = ["Thermal Molecular Movement in , Order and Probability","Molecular and Ionic Interactions as the Basis for the Formation","Interfacial Phenomena and Membranes"] 
    mystring = "".join(filter(lambda line:all(pattern not in line for pattern in pattern_list),mystring)) 
    # print the processed lines 
    print(mystring) 

объяснил: список фильтров строк в соответствии состояния: нет нежелательных шаблонов должно быть в строке.

+0

Это большое спасибо: знаете ли вы, как бы удалить всю линию, а не только шаблон? «Раздел 3.1,« Энергетика и динамика биологических систем »,« удалить всю эту строку ... »Я попытался« mystring.pop (i) », но он дает: AttributeError: объект« str »не имеет атрибута« pop », –

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