我想获取一个文件,并替换从字典中的值中获取的文本。我遇到的问题是我只希望它运行一次并在文本中进行一次替换。我知道有几种方法可以在文本文件中进行“查找和替换”,但是我似乎无法解决这个问题。
如果文本文件是:
TenGigabitEthernet1/1/1
config1
TenGigabitEthernet1/1/2
config2
TenGigabitEthernet1/1/3
config3
问题是我将“ TenGigabitEthernet1 / 1/1”替换为“ interface TenGigabitEthernet1 / 1/3”,但是一旦到达字典中的下一个值,它就会再次更改。我只需要更换一次,但是看不到任何方法。您将在底部看到结果。
from re import sub
#Based on dict, replaces key with the value on the target
def replace_content(dict_replace, target):
for check, replacer in list(dict_replace.items()):
target = sub(check, replacer, target)
return target
dict_replace = {
"interface TenGigabitEthernet1/1/1": "interface TenGigabitEthernet1/1/3",
"interface TenGigabitEthernet1/1/2": "interface TenGigabitEthernet1/1/1",
"interface TenGigabitEthernet1/1/3": "interface TenGigabitEthernet1/1/2"
}
file_open = open('textold.txt', 'r')
file_read = file_open.read()
file_open.close()
new_file_open = open('new_file.txt', 'w')
new_content = replace_content(dict_replace, file_read)
new_file_open.write(new_content)
new_file_open.close()
# Test
print("Old Text: ")
print(file_read)
print("New Content 1: ")
print(new_content)
我得到的结果是:
Old Text:
interface TenGigabitEthernet1/1/1
config 1
interface TenGigabitEthernet1/1/2
config 2
interface TenGigabitEthernet1/1/3
config 3
New Content 1:
interface TenGigabitEthernet1/1/2
config 1
interface TenGigabitEthernet1/1/1
config 2
interface TenGigabitEthernet1/1/2
config 3
答案 0 :(得分:0)
这是个主意。您可以指定中间哈希(或其他唯一值)来替换值,然后在末尾替换哈希。
工作示例
from re import sub
from uuid import uuid4
# Based on dict, replaces key with the value on the target
def _replace_content(to_h, target):
for check, replacer in to_h.items():
target = sub(check, replacer, target)
return target
def replace_content(to_h, h_lookup, target):
target = _replace_content(to_h, target)
for h, final_out in h_lookup.items():
target = sub(h, final_out, target)
return target
dict_replace = {
"interface TenGigabitEthernet1/1/1": "interface TenGigabitEthernet1/1/3",
"interface TenGigabitEthernet1/1/2": "interface TenGigabitEthernet1/1/1",
"interface TenGigabitEthernet1/1/3": "interface TenGigabitEthernet1/1/2"
}
to_hash = {}
intermediate_hash_lookup = {}
for check, replace in dict_replace.items():
intermediate_hash = str(uuid4())
intermediate_hash_lookup[intermediate_hash] = replace
to_hash[check] = intermediate_hash
file_read = """interface TenGigabitEthernet1/1/1
config 1
interface TenGigabitEthernet1/1/2
config 2
interface TenGigabitEthernet1/1/3
config 3"""
new_content = replace_content(to_hash, intermediate_hash_lookup, file_read)
if __name__ == '__main__':
# Test
print("Old Text: ")
print(file_read)
print()
print("New Content 1: ")
print(new_content)
输出
Old Text:
interface TenGigabitEthernet1/1/1
config 1
interface TenGigabitEthernet1/1/2
config 2
interface TenGigabitEthernet1/1/3
config 3
New Content 1:
interface TenGigabitEthernet1/1/3
config 1
interface TenGigabitEthernet1/1/1
config 2
interface TenGigabitEthernet1/1/2
config 3
Process finished with exit code 0
答案 1 :(得分:0)
这是一种可能的解决方案:
from re import sub
dict_replace = {
"interface TenGigabitEthernet1/1/1": "interface TenGigabitEthernet1/1/3",
"interface TenGigabitEthernet1/1/2": "interface TenGigabitEthernet1/1/1",
"interface TenGigabitEthernet1/1/3": "interface TenGigabitEthernet1/1/2"
}
new_file = []
with open('textold.txt', 'r') as read_file:
for line in read_file:
clean_line = line.strip() # Removes \n to make proper comparison
if clean_line in dict_replace:
new_file.append(dict_replace[clean_line] + '\n')
else:
new_file.append(line)
with open('new_file.txt', 'w') as write_file:
for line in new_file:
write_file.write(line)
作为一些一般性建议,最好避免显式打开和关闭诸如文件和数据库之类的资源,如下所示:
file_open = open('textold.txt', 'r')
和file_open.close()
通常最好使用context managers,因为它们可确保在离开with
语句的上下文后自动关闭资源。
with open('textold.txt', 'r') as read_file: