PYTHON多次从参考文件打印

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

我有一个关于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.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时,没有打印任何内容。请检查一下这个好吗?谢谢。这非常有助于理解我遗漏了什么和代码。非常感谢您的帮助。这对于理解我遗漏的内容和代码非常有帮助。非常感谢你的帮助。