【问题标题】:Python - List comprehension within File I/O codePython - 文件 I/O 代码中的列表理解
【发布时间】:2013-02-22 02:00:07
【问题描述】:

我想使用列表推导复制以下代码的功能:

with open('file.txt', 'w') as textfile:
    for i in range(1, 6):
        textfile.write(str(i) + '\n')

我尝试了以下方法:

with open('file.txt', 'w') as textfile:
    textfile.write(str([i for i in range(1, 6)]) + '\n')

但它(可以理解)打印[1, 2, 3, 4, 5],而不是单行上的一个数字。

对于“你为什么要这样做?”我没有答案;我只是想看看有没有可能。谢谢!

编辑:谢谢大家的回复;出于某种原因,我的印象是列表推导总是封装在 [] 中。

【问题讨论】:

  • 列表推导总是被[]包围。生成器表达式被 () 包围,也可以直接传递给函数而不用加倍 (())
  • @gnibbler:今天第一次听说生成器表达式。谢谢!

标签: python list io


【解决方案1】:

一种方法是file.writelines():

with open('file.txt', 'w') as textfile:
    textfile.writelines(str(i) + "\n" for i in range(1, 6))

【讨论】:

  • 几乎——我不认为writelines 实际上附加了换行符。
  • @mgilson 确实,已更新 - 我正在寻找要检查的文档。
  • writelines 也是我的第一印象——我不知道为什么我选择了join——也许是为了尽可能多地保留 OP 的原始代码。无论如何,writelines 这里绝对干净。 +1
【解决方案2】:
textfile.write('\n'.join(str(i) for i in range(1,6)))

几乎是一回事。这将留下一个尾随换行符。如果你需要,你可以这样做:

textfile.write(''.join('{}\n'.format(i) for i in range(1,6)))

【讨论】:

  • with open('/tmp/foo.txt','w') as f: [f.write(str(i)+' ') for i in range(0,10)]
  • @Arcturus -- 我实际上并不推荐这个。 List-Comprehensions 用于构建列表。如果您实际上不打算使用它构建的列表,那么我认为只使用循环会更干净。
【解决方案3】:

此外,如果您正在编写可由其他应用程序使用的文本,则通常您正在编写 CSV,而csv 模块使这些事情变得容易。

(在这种情况下,每行只有一个值,因此可能不需要。)

import csv

with open("file.txt", "wb") as out_f:
    writer = csv.writer(out_f)
    writer.writerows([[i] for i in range(1, 6)])

注意csv 模块会为您将 int 转换为 str

【讨论】:

    【解决方案4】:

    你也可以试试

    with open('/tmp/foo.txt','w') as f:
        [f.write(str(i)+' ') for i in range(0,10)]
    

    以@monkut 或@mgilson 为例

    【讨论】:

      【解决方案5】:

      请尝试以下方法:

      open('/tmp/foo.txt','w').writelines(f'{i}\n' for i in range(10))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-28
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        相关资源
        最近更新 更多