【问题标题】:PYTHON several times print from a reference filePYTHON 多次从参考文件中打印
【发布时间】:2013-07-31 17:22:20
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: python string file reference repeat


    【解决方案1】:
    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)
    

    【讨论】:

    • 这个打印出来的是333335555566666而不是356356356356356。有什么方法吗?
    • 当我使用这个时,类型错误:join() 只发生了一个参数。另外,我在 f1 之后加上:当我在 join() 中删除重复时,没有打印任何内容。请检查一下好吗?谢谢。
    【解决方案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)
    

    或者,在某些情况下,您有一个可重用的迭代器(如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)
    

    【讨论】:

    • 这对于理解我错过的内容和代码非常有用。非常感谢您的帮助。
    猜你喜欢
    • 2019-04-04
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多