我对python编程有疑问。
如果我有一个像
这样的参考文件(ref.txt)3
5
6
我想创建一个输出文件,如果我想要这些字符串的5倍
3
5
6
3
5
6
3
5
6
3
5
6
3
5
6
总共15行。
我想过像
这样的代码with open('ref.txt') as f1, open('out.txt', 'w') as f2:
for i in range(1, 6):
for line in f1:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
此代码只打印原始值。如何打印多条参考值的重复行。
感谢。
答案 0 :(得分:4)
repeat = ""
with open('ref.txt') as f1:
for line in f1:
repeat = "".join([repeat, line])
with open('out.txt', 'w') as f2:
f2.write(repeat*5)
答案 1 :(得分:2)
Stephan的回答解释了如何做到这一点,但没有解释你的尝试有什么问题:
with open('ref.txt') as f1, open('out.txt', 'w') as f2:
for i in range(1, 6):
for line in f1:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
您遇到了一个小问题,因为range(1, 6)
中只有5个值(print
出来并看到);你想在这里range(6)
。
但这里的主要问题是你只打开ref.txt
一次,但试图重复迭代它。您不能使用文件或任何其他类型的迭代器。迭代器的整个点在迭代时会被“用完”。
有四种基本解决方案:
如果你有办法“重置”迭代器,你可以每次循环都这样做。大多数迭代器不能这样做,但文件可以seek
:
with open('ref.txt') as f1, open('out.txt', 'w') as f2:
for i in range(6):
for line in f1:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
f1.seek(0)
或者,如果你可以(足够便宜)每次通过循环获得一个新的,干净的迭代器,你就可以这样做。在这种情况下,这只是意味着每次都打开文件:
with open('out.txt', 'w') as f2:
for i in range(6):
with open('ref.txt') as f1:
for line in f1:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
或者,在某些情况下,你有一个可重用的可迭代(如list
),你可以从中获得迭代器,你只需使用它而不是迭代器。但这不适用于此。
最后,您可以通过将值存储在list
或其他可重复类型(如字符串)中来创建可重用的可迭代。例如:
with open('ref.txt') as f1:
lines = list(f1)
with open('out.txt', 'w') as f2:
for i in range(6):
for line in lines:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
您可能希望将部分或全部处理移动到第一个块中,因此您不会连续6次执行此操作。例如:
with open('ref.txt') as f1:
lines = [' '.join(line.split()) + '\n' for line in f1]
with open('out.txt', 'w') as f2:
for i in range(6):
for line in lines:
f2.write(line)
一旦你有了这个,你可以进一步改进它:
with open('ref.txt') as f1:
lines = [' '.join(line.split()) + '\n' for line in f1]
data = ''.join(lines)
with open('out.txt', 'w') as f2:
for i in range(6):
f2.write(data)
更进一步:
with open('ref.txt') as f1:
lines = [' '.join(line.split()) + '\n' for line in f1]
data = ''.join(lines)
with open('out.txt', 'w') as f2:
f2.write(data * 6)