2016-09-20 6 views
0

Я пытаюсь заменить небольшой фрагмент текста блоком текста. Я надеюсь, что этот блок текста будет заменен, заменив функцию python. Я бы очень хотел использовать sed, чтобы получить эту работу, но я нахожусь на машине Windows. В любом случае, вот мой сценарий, не знаю, почему блок текста не заменяется.Заменить конкретный текст блоком текста

# Change the current working directory to IDX location 
import os 
print os.getcwd() 
os.chdir(##location of my text files##) 
print os.getcwd() 

#Read file names 

com_line=raw_input("File name please:") 
contents=[] 
strs = '#DREFIELD IDOL_SOURCE="idol source"\n#DREFIELD IDOL_TAXONOMY="taxonomy data"\n #DREFIELD IDOL_CATEGORY="IDOL_CATEGORY"\n #DREFIELD IDOL_PROMOTION="idol_promotion"\n #DREFIELD IDOL_PROMOTION_TERM="IDOL_PROMOTION_TERM"\n #DREFIELD IDOL_WHATSNEW="IDOL_WHATSNEW"\n #DREFIELD IDOL_SUMMARY="IDOL_SUMMARY"\n #DREFIELD IDOL_URL="IDOL_URL DATA"\n #DREFIELD IDOL_FORMNUMBER="IDOL_FORMNUMBER"\n #DREFIELD IDOL_DESCRIPTION="IDOL_DESCRIPTION DATA"\n#DRESECTION 0\n' 
with open(com_line) as f: 
    contents.append(f.readlines()) 
f.close 

#Writing to file 
f2 = open("test.idx", 'w') 

for content in contents: 
    for s in content: 
     if s == '#DRESECTION 0\n': 
      s.replace("#DRESECTION 0\n", strs) 
     f2.write("%s" % s) 
f2.close 

Я проверил этот код, и он также вводит условное утверждение. Просто интересно, почему нужный текст #DRESECTION 0\n не заменяется на strs? Также я ищу, чтобы сделать эту операцию больших текстовых файлов на несколько концертов. Есть ли лучший способ чтения больших текстовых файлов в python?

ответ

3

Стыки в Python неизменяемы. После создания строкового объекта его нельзя изменить. Однако вы можете создать новую строку на основе старой.

Когда вы звоните s.replace, он не изменяет s на месте, потому что это невозможно. Вместо этого метод str.replace возвращает новую строку. Вы можете сделать s = s.replace(...), и он должен работать. Однако нет смысла заменять все содержимое одной строки другой строкой, когда вы можете просто переписать имя в новую строку.

Я предлагаю использовать:

if s == '#DRESECTION 0\n': 
     s = strs 
    f2.write(s) 

Я также изменил write вызов. Здесь нет необходимости использовать подстановку строк, так как вы хотите написать целую строку (и ничего лишнего). Просто передайте s в качестве аргумента.

Есть несколько других незначительных проблем с вашим кодом:

Например, вы не назвав close методы на ваших файлов, только называя их. Вам нужно f2.close(), если вы действительно хотите закрыть файл. Но на самом деле вам не нужно делать это для f, так как оператор with, который вы используете, автоматически закроет файл (вы, вероятно, должны использовать with для f2 и не беспокоиться о ручном вызове close).

Вроде бы не нужно contents быть вложенным списком (всего один элемент во внешнем списке). Вероятно, вы хотите сделать contents = f.readlines(), а не append, введя список строк в изначально пустой список. Это позволит вам избавиться от одной из циклов в более позднем коде.

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

  • Нет связанных вопросов^_^