在文本文件中搜索Word并用字典中的值替换一次

时间:2020-05-13 19:54:28

标签: python

我想获取一个文件,并替换从字典中的值中获取的文本。我遇到的问题是我只希望它运行一次并在文本中进行一次替换。我知道有几种方法可以在文本文件中进行“查找和替换”,但是我似乎无法解决这个问题。

如果文本文件是:

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

2 个答案:

答案 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: