PYTHON多次从参考文件打印
我有一个关于python编程的问题 如果我有一个参考文件(ref.txt),比如 我想制作一个输出文件,就像我想将这些字符串乘以5一样PYTHON多次从参考文件打印,python,string,file,reference,repeat,Python,String,File,Reference,Repeat,我有一个关于python编程的问题 如果我有一个参考文件(ref.txt),比如 我想制作一个输出文件,就像我想将这些字符串乘以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
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)
这段代码只打印原始值。如何打印参考值的多个重复行
谢谢 斯蒂芬的回答解释了如何做到这一点,但没有解释你的尝试有什么问题:
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)
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)
您有一个小问题,在范围(1,6)
中只有5个值(打印并查看);您需要范围(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)
或者,在某些情况下,您有一个可重用的iterable(如列表
),可以从中获得迭代器,您可以使用它而不是迭代器。但这不适用于这里
最后,您可以通过将值存储在列表
或其他可重复类型(如字符串)中来创建一个可重用的iterable。例如:
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)
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)
您可能希望将部分或全部处理移到第一个块中,这样就不会连续执行6次。例如:
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)
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)
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)
您有一个小问题,在范围(1,6)
中只有5个值(打印并查看);您需要范围(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)
或者,在某些情况下,您有一个可重用的iterable(如列表
),可以从中获得迭代器,您可以使用它而不是迭代器。但这不适用于这里
最后,您可以通过将值存储在列表
或其他可重复类型(如字符串)中来创建一个可重用的iterable。例如:
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)
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)
您可能希望将部分或全部处理移到第一个块中,这样就不会连续执行6次。例如:
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)
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)
这将打印出33333555556666,而不是356356356。有什么方法吗?当我使用此方法时,类型错误:join()只接受一个参数。还有,我把:放在f1之后。当我删除join()中的repeat时,没有打印任何内容。请检查一下这个好吗?谢谢。这张打印出来的是33333555556666,而不是356356356。有什么方法吗?当我使用此方法时,类型错误:join()只接受一个参数。还有,我把:放在f1之后。当我删除join()中的repeat时,没有打印任何内容。请检查一下这个好吗?谢谢。这非常有助于理解我遗漏了什么和代码。非常感谢您的帮助。这对于理解我遗漏的内容和代码非常有帮助。非常感谢你的帮助。