我有一个模板txt文件。此txt文件将被写为10个新文件,但每个文件都根据任意值列表更改了一些字符:
with open('template.txt') as template_file:
template = template_file.readlines()
for i in range(10):
with open('output_%s.txt' % i, 'w') as new_file:
new_file.writelines(template_file)
列表的长度与新文件的数量(10)相同。
我正在尝试用我列表中的值替换每个新文件的第二行的一部分。
所以例如,我想要第2行,每个新文件中的位置[5:16]被替换为列表中的相应值。
文件0将包含列表的元素0 文件1将具有列表的元素1 等。
我尝试使用replace()
方法:
list = [element0, element1, etc...element9]
for i in template_file:
i.replace(template_file[2][5:16], list_element)
但它只会用第一个列表元素替换所有文件......它不会循环。
任何帮助表示赞赏
答案 0 :(得分:1)
我可以找到一些阻止您的代码工作的问题:
template
,这是一个行列表,而不是template_file
,它是一个文件对象在Python中,字符串是不可变的,这意味着它们无法更改。 replace
函数不会更改字符串,它会返回字符串的新副本。此外,replace
将用新文本替换子字符串,而不管子字符串在哪里。如果你想在特定索引处替换,我建议你自己切换字符串。例如:
line2 = '0123456789ABCDEFG'
element = '-ho-ho-ho-'
line2 = line2[:5] + element + line2[16:]
# line2 now is '01234-ho-ho-ho-G'
请不要将list
用作变量名称。它是一种类型,可用于构建新列表:
empty = list() # ==> []
letters = list('abc') # ==> ['a', 'b', 'c']
表达式template_file[2][5:16]
不正确:首先,它应该是template
,而不是template_file
。其次,第二行应为template[1]
,而不是template[2]
,因为Python列表为零
list_element
变量未在您的代码中声明话虽这么说,我发现将模板文件构造为带有占位符的真实模板更容易。我稍后会谈到这个。如果您仍然坚持用某些东西替换第2行的索引5-16,这是我测试的解决方案,它可以工作:
with open('template.txt') as template_file:
template = template_file.readlines()
elements = ['ABC', 'DEF', 'GHI', 'JKL']
for i, element in enumerate(elements):
with open('output_%02d.txt' % i, 'w') as out_file:
line2 = template[1]
line2 = line2[:5] + element + line2[16:]
for line_number, line in enumerate(template, 1):
if line_number == 2:
line = line2
out_file.write(line)
注释
如果你能控制模板文件,我建议使用string.Template
类来简化搜索和替换。由于我不知道您的模板文件是什么样的,我将构建自己的模板文件:
line #1
This is my ${token} to be replaced
line #3
line #4
请注意,我打算将${token}
替换为代码中的一个元素。现在转到代码:
import string
with open('template.txt') as template_file:
template = string.Template(template_file.read())
elements = ['ABC', 'DEF', 'GHI', 'JKL']
for i, element in enumerate(elements):
with open('output_%02d.txt' % i, 'w') as out_file:
out_file.write(template.substitute(token=element))
注释
template_file.read()
一次阅读整个文件。如果模板文件很大,这可能是一个问题,但之前的解决方案遇到了与此相同的性能问题string.Template
类来简化搜索/替换substitute(token=element)
完成,其中说:用$token
替换${token}
中的所有template
或element
个实例。如果模板文件太大而无法一次装入内存,您可以修改第一个解决方案,逐行读取,而不是一次读取所有行。我不会在这里提出这个解决方案,只是一个暗示。
答案 1 :(得分:0)
看起来你需要
list = [element0, element1, etc...element9]
for i in list:
template_file = template_file.replace(template_file[2][5:16], i)