【问题标题】:why do [line in open("text.txt")] yield newlines?为什么 [line in open("text.txt")] 会产生换行符?
【发布时间】:2016-01-22 14:05:53
【问题描述】:

(注意:我不是想改变任何东西——只是想理解)

查看在 python 中读取文件的解决方案,每次都应删除换行符:

In [5]: [line for line in open("text.txt", "r")]
Out[5]: ['line1\n', 'line2']

虽然直观的行为(从一些 que stions 的受欢迎程度来看)只是产生剥离的线条?

这背后的原理是什么?

-- 编辑--

当然:“直觉”是主观的。然而,“一致”就不是那么回事了。显然"line1\nline2".splitlines() 中的“线”概念与iter(open("text.txt")) 处理的概念不同:

>>> assert(open("text.txt").readlines() == \
... open("text.txt").read().splitlines())
AssertionError

很确定人们确实被这个抓住了。

所以我错了:也许我的直觉正好符合splitlines 的解释:拆分的东西不应该包括分隔符。也许我的问题的答案不是技术性的,而更像是“因为 PEP-xyz 被不同的人批准而不是 PEP-qrs”。也许我应该把它发布到一些 python 语言论坛。

【问题讨论】:

  • “很多人不希望得到换行符”并不一定意味着这是直观的设计。也许换行者的预期人数比换行者的人数多出一百比一——你只是不知道,因为他们都没有在 SO 上发帖说“我使用了 for line in file,它给了我完全符合我的想法”
  • 我会阅读Zen of Python - 其中指出“显式优于隐式。”。在某些情况下,隐式剥离新行可能不起作用,例如将这些行写到另一个文件中。
  • 我相信一些大而重要的机构决定,一行是一个以预定义字符或字符集(换行符)结尾的字符序列。这意味着“line1”实际上不是一行,这也是为什么有些人认为没有尾随换行符的文件无效的原因。
  • docs.python.org/2/library/stdtypes.html#str.splitlines 看看这个,船长很明显:“返回字符串中的行列表,[...] 换行符不包含在结果列表中”。我认为这是一个关于设计的有效问题,如果答案未知,则不应该是,“因为显然一行末尾有一个 '\n' 字符·.

标签: python file readlines design-rationale


【解决方案1】:

嗯,这是一条线。行以字符\n 结尾来定义。如果一个字符序列不是以\n(或EOF)结尾,我们怎么知道它是一行?

"hello world"
"hello world\n"

第一个不是一行,如果我们打印两次可能会得到

hello worldhello world

第二个版本会给我们吗

hello world
hello world

【讨论】:

  • 我希望如果您迭代一个可迭代对象,分隔每个项目的元素不会包含在每个项目的末尾。例如,在 csv 模块上,您还可以将遍历它们的元素分开,并且逗号和换行符不会出现在结果中。
猜你喜欢
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2020-08-05
  • 2012-08-08
  • 1970-01-01
  • 2022-07-06
相关资源
最近更新 更多