【问题标题】:Why Python language does not have a writeln() method?为什么 Python 语言没有 writeln() 方法?
【发布时间】:2010-04-04 19:33:58
【问题描述】:

如果我们需要在文件中写入新行,我们必须编写代码:

file_output.write('Fooo line \n')

Python 没有writeln() 方法有什么原因吗?

【问题讨论】:

  • 转过身来:为什么有些语言会根据您是否要包含结束换行符而使用不同的函数进行输出?这至少可以追溯到我很早就学到的帕斯卡,但我开始更喜欢输出中换行符的显式表示。
  • 如果需要,您可以在另一篇文章中查看this answer

标签: python syntax history language-design


【解决方案1】:

在 Python 2 中,使用:

print >>file_output, 'Fooo line '

在 Python 3 中,使用:

print('Fooo line ', file=file_output)

【讨论】:

  • 请注意,print 函数可通过 __future__ 导入从 Python 2.6 开始使用。
【解决方案2】:

省略了提供file 方法的对称接口,因为writeln() 没有意义:

  • read() 匹配 write():它们都对原始数据进行操作
  • readlines() 匹配 writelines():他们都在包括 EOL 在内的线路上运行
  • readline() 很少使用;迭代器做同样的工作(除了可选的size 参数)

writeline()(或writeln())与write() 基本相同,因为它不会添加EOL(以匹配writelines() 的行为)。

模仿 print 到文件的最佳方法是使用 Python 2.x 的特殊打印到文件语法或 print() 函数的 file 关键字参数,就像 Daniel 建议的那样。

就个人而言,我更喜欢print >>file, ... 语法而不是file.write('...\n')

【讨论】:

  • @eftinis,因为readline 存在,你的“对称”声明并不真正成立。 readline 方法的罕见使用也不排除它在某些情况下的好处(例如,可能需要提前读取一两行的解析器)。
  • 出色的观察@SimplyKnownAsG。关于对称的主要论点根本不正确!
【解决方案3】:

我觉得应该。您可以使用的最近的东西是:

file_output.writelines([foo_msg, '\n'])

【讨论】:

  • 根据我的经验,这种方法效果更好,而且我认为它比out.write(foo_msg+'\n') 更安全。也许一些 Python I/O 子系统的民间专家可以证实这一点。
【解决方案4】:

print() 是您正在寻找的功能。与 python 中的许多核心多态性一样,打印是由内置函数而不是使用方法提供的(就像len()next()repr() 等!)。

print() 函数作为通用接口也使其更加通用,而文件对象本身不必实现它。在这种情况下,它默认以换行符结束,但可以在函数调用中选择,例如:

print("text", file=sys.stderr, end="\n")

在您建议的用例中,所有文件对象不仅要实现.write() 方法(现在由print() 使用),还要实现.writeln(),甚至更多!这种基于函数的多态性使得 python 非常丰富,而不会增加接口的负担(记住鸭子类型的工作原理)。

注意:这个模型一直是 Python 的核心。它只是在我的示例中更纯粹,与 Python 3 相关

【讨论】:

    【解决方案5】:

    可能没有真正的原因,只是在需要时编写换行符真的很容易,那么为什么要使用额外的方法来弄乱文件界面呢?

    【讨论】:

    • 你通常使用我问题中使用的语法吗?
    • Python 的print 函数默认在字符串末尾打印一个新行。
    • 回答你的反问:效率。考虑 (1) f.write(stuff); f.write('\n') (2) f.write(stuff + '\n')` (3) f.writeln(stuff)
    • 在我看来,在进行文件 I/O 时,函数调用不太可能影响整体效率。最终字节将被写入某处,并且 I/O 将成为瓶颈,而不是对写入函数的额外调用。对于保持界面精简,还有一些话要说。
    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2019-09-17
    • 1970-01-01
    • 2016-06-11
    • 2012-01-04
    • 2023-04-04
    • 2012-05-02
    • 2017-07-31
    相关资源
    最近更新 更多