【问题标题】:How to write list of strings to file, adding newlines?如何将字符串列表写入文件,添加换行符?
【发布时间】:2011-07-22 16:37:14
【问题描述】:
def generator():
    nums = ['09', '98', '87', '76', '65', '54', '43']
    s_chars = ['*', '&', '^', '%', '$', '#', '@',]

    data = open("list.txt", "w")
    for c in s_chars:
        for n in nums:
            data.write(c + n)
    data.close()

我想在每个“c + n”之后添加一个换行符。

【问题讨论】:

  • 您能否添加一个示例,您希望输出的外观如何?尚不清楚您要在哪里添加换行符。

标签: python file-io newline


【解决方案1】:

改变

data.write(c + n)

data.write("%s%s\n" % (c, n))

【讨论】:

  • 这很复杂,与简单的print 相比,它的设计目的是按照原始发布者的要求。
  • @Ignacio:我确实不会说data.write('\n') 是“错误的”。但是,我确实认为它违背了 Python 的禅宗(“应该有一种——最好只有一种——明显的方法。”):因为 print 旨在添加换行符,所以感觉真的在这种情况下不使用它对我来说很奇怪。
  • @EOL:我不同意print 是这里的“明显”方式。为了在 Python 2.x 下使用带有文件句柄的 print,您必须知道重定向运算符 >>,它永远不会在该语言的任何其他地方使用。无论如何, print-chevron 只是 write() 的语法糖。 file.write() 旨在将您的(简单)数据放入文件中,而不管这些数据的内容如何。在 Python 3 中,我可能会同意你的看法。
  • @Josh:很公平。 :) 另一方面,当您有很多换行符分隔的行要打印到文件时,Python 2.x 中的 chevron 运算符是必须的:执行 print >> …, … 比执行大量 ….write("%s\n" % …) 轻得多。它也可以说更易读,因为它意味着“我正在用换行符打印行”,而write() 中的格式字符串必须在得出这个结论之前进行视觉解析。
  • 不知道你所说的“打火机”是什么意思。但是,我确实看到并同意您关于易读性的观点;这是看待它的好方法。
【解决方案2】:

正确放置的data.write('\n') 将处理该问题。只需为要标点的循环适当缩进即可。

【讨论】:

    【解决方案3】:

    正如其他答案已经指出的那样,您可以通过将“\n”附加到c+n 或使用格式字符串“%s%s\n”来做到这一点。

    出于兴趣,我认为使用列表推导式而不是两个嵌套循环会更符合 Python 风格:

    data.write("\n".join("%s%s"%(c,n) for c in s_chars for n in nums))
    

    【讨论】:

    • 这不会在写出之前在内存中构造整个字符串吗?
    • @detly:是的。在这种情况下,生成的字符串应该足够短。只要有足够的内存,它应该会快一些。
    • @detly:我添加了an answer with the same basic behavior that avoids that peak memory usage issue 正是为了解决这个问题。很少有人知道writelines。我的答案使用额外的内置函数将所有工作推送到 C,但这个答案仍然可以通过小调整获得峰值内存使用量减少的好处:data.writelines('%s%s\n' % (c, n) for c in s_chars for n in nums)
    【解决方案4】:

    Python 的print 是标准的“带换行符打印”函数。

    因此,如果你使用 Python 2.x,你可以直接这样做:

    print  >> data, c+n
    

    如果你使用 Python 3.x:

    print(c+n, file=data)
    

    【讨论】:

      【解决方案5】:

      改变

      data.write(c+n)
      

      data.write(c+n+'\n')
      

      【讨论】:

        【解决方案6】:

        writelinesproduct将更多的工作推到C层:

        from future_builtins import map  # Only do this on Python 2; makes map generator function
        import itertools
        
        def generator():
            nums = ['09', '98', '87', '76', '65', '54', '43']
            s_chars = ['*', '&', '^', '%', '$', '#', '@',]
            # Append newlines up front, to avoid doing the work len(nums) * len(s_chars) times
            # product will realize list from generator internally and discard values when done
            nums_newlined = (n + "\n" for s in nums)
        
            with open("list.txt", "w") as data:
                data.writelines(map(''.join, itertools.product(s_chars, nums_newlined)))
        

        这产生了与嵌套循环相同的效果,但使用 C 中实现的内置函数(无论如何在 CPython 参考解释器中)这样做,从而消除了图片中的字节码执行开销;这可以显着提高性能,特别是对于较大的输入,并且与涉及将整个输出的'\n'.join 转换为单个字符串以执行单个write 调用的其他解决方案不同,它在写入时进行迭代,因此峰值内存使用量保持固定而不是要求您在单个字符串中一次实现内存中的整个输出。

        【讨论】:

          【解决方案7】:

          这个对我有用

          with open(fname,'wb') as f:
              for row in var:
                  f.write(repr(row)+'\n')
          

          【讨论】:

            【解决方案8】:
            def generator():
                 nums = ['09', '98', '87', '76', '65', '54', '43']
                 s_chars = ['*', '&', '^', '%', '$', '#', '@',]
            
                 data = open("list.txt", "w")
                 for c in s_chars:
                    for n in nums:
                       data.write(c + n + "\n")
                 data.close()
            

            def generator():
                 nums = ['09', '98', '87', '76', '65', '54', '43']
                 s_chars = ['*', '&', '^', '%', '$', '#', '@',]
            
                 data = open("list.txt", "w")
                 for c in s_chars:
                    for n in nums:
                       data.write(c + n)
                    data.write("\n")
                 data.close()
            

            取决于你想要什么。

            【讨论】:

              【解决方案9】:

              在之前的回复中,我因误解了要求而作了错误的回答,请忽略。

              我认为你可以使用join 来简化内部循环

              data = open("list.txt", "w")
              for c in s_chars:
                  data.write("%s%s\n" % (c, c.join(nums)))
              data.close()
              

              【讨论】:

              • zip() 不等于两个 嵌套 循环...
              • 对不起,我误解了要求。我已经更正了我的答案。
              猜你喜欢
              • 2019-09-23
              • 2014-04-18
              • 1970-01-01
              • 1970-01-01
              • 2020-10-03
              • 2016-06-15
              • 2010-11-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多