1

我有一个关于 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)

此代码仅打印原始值。如何打印多个重复的参考值行。

谢谢。

4

2 回答 2

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)
于 2013-07-31T17:24:55.370 回答
2

斯蒂芬的回答解释了如何做到这一点,但没有解释你的尝试有什么问题:

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)

或者,在某些情况下,您有一个可重用的迭代器(如 a list),您可以从中获取迭代器,您可以使用它来代替迭代器。但这不适用于这里。


最后,您可以通过将值存储在 a或其他可重复类型(如字符串)中来创建可重用的迭代。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)
于 2013-07-31T18:02:55.357 回答