我正在制作一个Python程序,通过替换几个字符和子字符串来编辑.txt
文件。
步骤:
我必须
readlines()
input_file
每行append()
input_list
。遍历
input_list
和replace()
每行中的一些内容。中这些已修改的行
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
问题:
有没有更聪明的方法呢? (在循环列表时替换大量字符串)
有谁能解释一下我做错了什么? (为什么我的软件会创建一个奇怪的输出?)
答案 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(...)
。