如何使用for循环时多次使用string.replace()?

时间:2015-11-09 18:31:53

标签: python regex replace

我正在制作一个Python程序,通过替换几个字符和子字符串来编辑.txt文件。

  

步骤:

     

我必须readlines() input_file每行append()   input_list

     

遍历input_listreplace()每行中的一些内容。

     

append() new_list

中这些已修改的行      

write()new_list内的每个项目改为output_file

但我认为我做错了......或者可能是以非智能的方式,因为我的软件正在取代我不想被替换的字符。

在这里,看看我的代码:

old = [] #input list
new = [] #output list
irrf_values = [] #list with len(old) tax values. I already have these values
aliq_pis = "000.6500"
aliq_cofins = "003.0000"

with open(input_file, "r") as f:
    old = f.readlines

i = 0
for line in old:
    irrf = irrf_values[i]

    line1 = line.replace(line[254:268], irrf)
    line2 = line1.replace(line1[332:333], "3")
    line3 = line2.replace(line2[433:434], "1")
    line4 = line3.replace(line3[438:439], "1")              
    line5 = line4.replace(line4[443:445], "00")             
    line6 = line5.replace(line5[479:487], aliq_pis)             
    line7 = line6.replace(line6[501:509], aliq_cofins)              
    line8 = line7.replace(line7[659:669], line[649:659])                
    line9 = line8.replace(line8[693:694], "0")

    newline = line9

    new.append(newline)
    i += 1

with open(output_file, "w") as g:
    for line in new:    
        g.write(line)

但是当我运行我的程序时,该行中的所有“1”都被“3”替换

例:

input_file 中的第1行(我要编辑的其中一行)

1011015                   000000001057.870000000000000021.16                                                00000001057.8700000000000.0000000000000.00              00000001057.8700000000000.0000000000000.0000000000000.00                    2069726000017500000000000.0000000000000.00   00.00              T4N00000000000.00 00090000001     0                                           SP01101500000000000.0000.0001.05.00    OU000B A  00400010434020         NFSE   010100000001057.87000.000000000000000.00000.000000000000000.00000900                                                                  0                        N                         SP 00000260310000000000                002.00000  43402           0

output_file 的第1行(在我的软件替换之后)

3033035                   000000003057.870000026033000023.36                                                00000003057.8700000000035.8700000000035.87              00000003057.8700000000035.8700000000035.8700000000035.87                    0069726000037500000000035.8700000000035.87   00.00              T0N00000000035.87 00090000003     0                                           SP03303500000000035.8700.0003.05.00    OU000B A  00000030030000         NFSE   030300000003057.87003.000000000000035.87003.000000000000035.87000900                                                                  0                        N                         SP 00000260330000026033                002.00000  03002           0

Line1 手动编辑(这是我正在寻找的输出)

1011015                   000000001057.870000000000000021.16                                                00000001057.8700000000015.8700000000000.00              00000001057.8700000000000.0000000000000.0000000000000.00                    2069726000017500000000000.0000000000000.00   00.00              T4N00000000000.00 00090000003     0                                           SP01101500000000000.0000.0001.05.00    OU000B A  00100011434000         NFSE   010100000001057.87000.650000000000006.88003.000000000000031.74000900                                                                  0                        N                         SP 00000260310000026031                002.00000  43402           0

问题:

  1. 有没有更聪明的方法呢? (在循环列表时替换大量字符串)

  2. 有谁能解释一下我做错了什么? (为什么我的软件会创建一个奇怪的输出?)

1 个答案:

答案 0 :(得分:3)

.replace(old, new)将使用old参数替换所有出现的new参数。

因此,当您执行line.replace(line[254:268], irrf)时,它将使用[254:268]范围内的行中的字符,并使用该字符搜索要由irrf替换的字符串中的所有匹配项。< / p>

如果你想像你现在一样使用切片,你可以像

那样进行每次替换
line1 = line[:254] + irrf + line[268:]

可以将其简化为具有def my_replace(input, replacement, start, stop)等签名的通用函数。

您也无需继续将替换结果分配给新字符串,因此您可以愉快地执行line = my_replace(...)