2016-06-20 3 views
0

я следующий код, который я думаю, что должно работать, но не кажется:поиск Python для строки в строке

old_name = 'Some User' 
new_name = 'New User' 

with open(complete_filename, 'r') as provisioning_file: 
    lines = provisioning_file.read() 
    # if the old_name is in this file 
    if old_name in lines: 
    file_found = 1 
    with open(complete_filename + '.new', 'w') as new_provisioning_file: 
     for line in lines: 
     line = line.replace(old_name, new_name) 
     new_provisioning_file.write(line) 
     # provisioning_file.write(re.sub(old_name, new_name, line)) 

complete_filename Файл будет множество конфигурационных файлов, я был тестирования с выбором файлов XML, пример фрагмент одного из них ниже:

<reg reg.1.address="1234" reg.1.label="Some User" > 
     <reg.1.auth reg.1.auth.password="XXXXXXXXXX" reg.1.auth.userId="1234" /> 
     <reg.1.outboundProxy reg.1.outboundProxy.address="sip.example.com" /> 
     <reg.1.server reg.1.server.1.address="sip.example.com" reg.1.server.1.expires="300" reg.1.server.2.expires="300" /> 
     <reg.1.serverFeatureControl reg.1.serverFeatureControl.dnd="0" /> 
    </reg> 

код находит old_name строку и переходит в if заявление, а затем открывает complete_filename.new для письма, но он, очевидно, никогда не находит старое имя в строк и просто выводит файл как есть (т. е. он не заменяет new_name для old_name).

Как видно из кода, я также экспериментировал с re.sub с аналогичными результатами. Что мне не хватает?

ответ

3
lines = provisioning_file.read() 

Это не похоже на меня. read() не возвращает список строк, он возвращает одну строку. Так что позже, когда вы делаете for line in lines:, вы не повторяете строки за строкой, вы повторяете один символ за раз.

Попробуйте split ting объект перед итерацией по нему. Я также предлагаю изменить его название, чтобы оно лучше описывало его содержимое.

with open(complete_filename, 'r') as provisioning_file: 
    text= provisioning_file.read() 
    # if the old_name is in this file 
    if old_name in text: 
    file_found = 1 
    with open(complete_filename + '.new', 'w') as new_provisioning_file: 
     for line in text.split("\n"): 
     line = line.replace(old_name, new_name) 
     new_provisioning_file.write(line + "\n") 

Edit: альтернативный подход:

old_name = 'Some User' 
new_name = 'New User' 

with open(complete_filename, 'r') as provisioning_file: 
    lines = provisioning_file.readlines() 
    # if the old_name is in this file 
    if any(old_name in line for line in lines): 
    file_found = 1 
    with open(complete_filename + '.new', 'w') as new_provisioning_file: 
     for line in lines: 
     line = line.replace(old_name, new_name) 
     new_provisioning_file.write(line) 
+0

Спасибо! Это имеет смысл. Думаю, тогда альтернативой будет 'lines = provisioning_file.readlines()'? Будет ли это другим способом решения? а затем итерации, как и я. – btongeorge

+0

Да, и на самом деле это может быть предпочтительным, так как тогда вам не нужно вручную писать символы новой строки в вызове 'write'. Но вам придется изменить условное выражение на 'if any (old_name в строке для строки в строках)', так как 'in' не выполняет частичное совпадение содержимого содержимого. (например, '" a "в [" ab "," cd "]' оценивается как False) – Kevin

+0

Я пробовал это, но получил синтаксическую ошибку условного выражения, любой шанс, который вы могли бы показать мне это в фрагменте в контексте? – btongeorge

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

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