2016-11-18 3 views
0

Я пишу в текстовый файл, но он не работает должным образом, как я ожидал.Python - эффективный способ записи в файл?

Вот что у меня есть:

#!/usr/lib/env python 
import re 

file = open("address.txt","r") 
content = file.read() 
file.close() 
content = content.split('LAN ')[1:] 
dic = {} 
for lan in content: 
    dic[int(lan[0])] = lan[1:] 



def address(lan_index): 
    address = re.findall('address\s(.*?)\s',dic[lan_index]) 
    if len(address) > 0: 
     print 'LAN', lan_index, ":", address[0] 
    else: 
     print 'No Address Found!' 
    return address[0] 


ad1 = str(address(1)) 
new_ad = ad1 
var1 = 'ad1' 


filedata = None 
with open('address.txt', 'r') as file : 
    filedata = file.read() 

filedata = filedata.replace(ad1 , var1) 

with open('address.txt', 'w') as file: 
    file.write(filedata) 

вот мой текстовый файл:

#line addresses LAN 1 
     address 192.168.6.6 
     network 192.168.6.6 

моя проблема, когда я хочу, чтобы заменить ad1 для var1 это обыкновение заменить только мой address только он заменит network а также имеют тот же IP-адрес.

Мой вывод что-то вроде этого:

адрес ad1

сеть ad1

Есть эффективный и возможный способ избежать этого и получить что-то вроде этого:

адрес ad1

сеть 192.168.6.6

Я был бы очень признателен, если это возможно. Спасибо

+1

Прочтите файл по строкам? Только заменить строку, если содержит адрес, а не сеть? –

+0

@ cricket_007 не плохая идея .. regex на самом деле часто медленнее, чем простые операции с строкой, если нужны только простые совпадения. преимущество регулярного выражения - гибкость и сложные шаблоны, а не скорость. – Aaron

ответ

2

Оба вашего адреса заменяются, потому что filedata.replace(ad1 , var1) жадный. Вы можете ограничить это, предоставив ему дополнительный третий аргумент: filedata.replace(ad1 , var1, 1) сообщив ему сделать не более 1 замен, или вы можете расширить свою группу захвата: '(address\s.*?)\s' включить «адрес» и сделать var1 = "address ad1" так, чтобы filedata.replace нашел только строки, адрес "в них

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