Python 为什么在替换文件中的文本时代码不起作用

Python 为什么在替换文件中的文本时代码不起作用,python,Python,我有一个名为test.txt的文件 我需要转换文件中与词典匹配的一个字符串 test.txt: abc asd ds {{ PRODUCT CATEGORY }} fdsavfacxvasdvvc dfvssfzxvdfvzd 代码如下: data = {'PRODUCT CATEGORY':'Customer'} all_files = ['test.txt'] out_files = ['ut.txt'] read_dict = {} for file in all_files:

我有一个名为
test.txt
的文件

我需要转换文件中与词典匹配的一个字符串

test.txt

abc
asd
ds
{{  PRODUCT CATEGORY  }}
fdsavfacxvasdvvc
dfvssfzxvdfvzd 
代码如下:

data = {'PRODUCT CATEGORY':'Customer'}
all_files = ['test.txt']
out_files = ['ut.txt']
read_dict = {}
for file in all_files:
    with open(file,'r') as read_file:
        lines = read_file.readlines()
        read_dict[file] = lines
for in_f, out_f in zip(all_files, out_files):
    with open(in_f,'r') as read_file:
        lines = read_file.readlines()
    with open(out_f,'w+') as write_file:        
        for line in lines:
            updated_line = []
            for word in line.split():
                if word in data:
                    updated_line.append(data[word])
                else:
                    updated_line.append(word)
            write_file.writelines(" ".join(updated_line))                            
            print (" ".join(updated_line))  
在末尾和开头有一个空格
产品类别

预期产出:

abc
asd
ds
Customer
fdsavfacxvasdvvc
dfvssfzxvdfvzd 

您正在按空格分割,并且“产品类别”中有一个空格,因此它永远找不到与该词完全匹配的词。如果在word in line.split()的
之后添加
print(word)
,则可以看到这一点

解决此问题的一种方法是将数据和test.txt文件中的
产品类别
替换为
产品类别

此外,在将每一行写入输出文件后,您将丢失新行进位,您应该替换:

    write_file.writelines(" ".join(updated_line))                            


解决了这两个问题后,您将获得所需的输出。

您将按空格进行拆分,并且“产品类别”中有一个空格,因此它无法找到与单词完全匹配的内容。如果在word in line.split()的
之后添加
print(word)
,则可以看到这一点

解决此问题的一种方法是将数据和test.txt文件中的
产品类别
替换为
产品类别

此外,在将每一行写入输出文件后,您将丢失新行进位,您应该替换:

    write_file.writelines(" ".join(updated_line))                            

解决了这两个问题后,您将获得所需的输出。

试试这个

import re
data = {'PRODUCT CATEGORY':'Customer'}
all_files = ['test.txt']
out_files = ['ut.txt']

for in_f, out_f in zip(all_files, out_files):
    with open(in_f,'r') as read_file:
        text = read_file.read()
        for word, replace_with in data.items():
            text = re.sub(r'\{+ *'+ word + r' *\}+', replace_with, text)
        open(out_f,'w+').write(text)
试试这个

import re
data = {'PRODUCT CATEGORY':'Customer'}
all_files = ['test.txt']
out_files = ['ut.txt']

for in_f, out_f in zip(all_files, out_files):
    with open(in_f,'r') as read_file:
        text = read_file.read()
        for word, replace_with in data.items():
            text = re.sub(r'\{+ *'+ word + r' *\}+', replace_with, text)
        open(out_f,'w+').write(text)

您不能在输入行上循环单个单词,因为这会阻止您查找由多个单词组成的词典关键字,就像您在示例中所使用的那样

这里是一个简单的重构,它打印到标准输出,这样您就可以看到您正在做什么

data={'productcategory':'Customer'}
所有_文件=['test.txt']
对于所有_文件中的文件:
打开(文件,'r')作为读取文件:
对于read_文件中的行:
对于数据中的关键字:
令牌=“{{%s}}%”关键字
如果令牌在行中:
line=line.replace(令牌、数据[关键字])
打印(行,结束=“”)
end=''
是必需的,因为
已经包含一个换行符,但是
print
想要提供自己的换行符;如果您将
写入
文件而不是
打印
,则可以避免这种特殊的怪癖。(但通常,更好的可重用性设计是只打印到标准输出,并让调用者决定如何处理输出。)

不清楚为什么输入文件中的行有一个单独的
read_dict
,或者为什么要读取文件两次,所以我删除了这些部分

一次循环一行文件可以避免将整个文件读入内存,因此如果您不关心前一行或下一行上的内容,这通常是一个好主意,并且可以扩展到更大的文件(您一次只需要在内存中保留一行,希望一行不是几GB)


下面是一个演示(我在
{{PRODUCT CATEGORY}}
中仅使用了一个空格,并修复了“customer”的拼写):

您不能在输入行上循环单个单词,因为这会阻止您查找由多个单词组成的词典关键字,就像您在示例中使用的那样

这里是一个简单的重构,它打印到标准输出,这样您就可以看到您正在做什么

data={'productcategory':'Customer'}
所有_文件=['test.txt']
对于所有_文件中的文件:
打开(文件,'r')作为读取文件:
对于read_文件中的行:
对于数据中的关键字:
令牌=“{{%s}}%”关键字
如果令牌在行中:
line=line.replace(令牌、数据[关键字])
打印(行,结束=“”)
end=''
是必需的,因为
已经包含一个换行符,但是
print
想要提供自己的换行符;如果您将
写入
文件而不是
打印
,则可以避免这种特殊的怪癖。(但通常,更好的可重用性设计是只打印到标准输出,并让调用者决定如何处理输出。)

不清楚为什么输入文件中的行有一个单独的
read_dict
,或者为什么要读取文件两次,所以我删除了这些部分

一次循环一行文件可以避免将整个文件读入内存,因此如果您不关心前一行或下一行上的内容,这通常是一个好主意,并且可以扩展到更大的文件(您一次只需要在内存中保留一行,希望一行不是几GB)


下面是一个演示(我冒昧地在
{{PRODUCT CATEGORY}}
中只使用了一个空格,并修复了“customer”的拼写):

到底“不工作”是什么意思?我不知道我应该寻找什么样的问题。@jasonharper也打印了预期的输出,因为您正在拆分单词,所以没有一个单词可以匹配
数据中的键,这是两个单词。不管怎么说,很多代码似乎都是多余的;我已经给出了输入、输出和代码示例,并且解释了为什么它不起作用;这不是你问的原因吗?但是,如果70%的代码与您的问题无关,那么就更容易看出哪里出了问题?我不知道我应该寻找什么样的问题。@jasonharper也打印了预期的输出,因为您正在拆分单词,所以没有一个单词可以匹配
数据中的键,这是两个单词。不管怎么说,很多代码似乎都是多余的;我已经给出了输入、输出和代码示例,并且解释了为什么它不起作用;这不是你问的原因吗?但如果70%的代码与您的问题无关,那么就更容易看出问题所在