why do [line in open(“text.txt”)] yield newlines?
(注:我不想改变任何事情-只是想理解)
查看用python读取文件的解决方案,每次都应该去掉换行符:
1 2 3
| In [5]: [line for line in open("text.txt","r")]
Out[5]: ['line1
', 'line2'] |
而直观的行为(根据一些关于这方面的问题的流行程度判断)将只是产生剥离的线条?
这背后的理由是什么?
--编辑——
当然,"直觉"是主观的。然而,一致性就不那么重要了。显然,"line1
line2".splitlines()中的"线"概念与iter(open("text.txt"))处理的"线"概念不同:
1 2 3
| >>> assert(open("text.txt").readlines() == \
... open("text.txt").read().splitlines())
AssertionError |
很肯定人们会被这个抓住。
所以我错了:也许我的直觉和splitlines的解释是一致的:分裂的东西不应该包括分隔符。也许我的问题的答案不是技术性的,但更像是"因为PEPXYZ得到了不同于PEPQRS的人的批准"。也许我应该把它发到一些Python语言论坛上。
- "很多人不希望得到新品"并不一定意味着这是直观的设计。也许newline的预期值比newline的预期值高出100比1——你只是不知道,因为没有人在上面发帖子说"我用了for line in file,它给了我我所想的。"
- 我会读到python的禅,它说"显式比隐式好"。在某些情况下,隐式剥离新行可能不起作用,例如,将新行写入另一个文件。
- 我相信一些大型的、重要的主体决定了一行是以一个预先定义的字符或一组字符(换行符)结尾的字符序列。这意味着"line1"实际上不是一行,也就是为什么有些人认为没有尾随新行的文件无效。
- docs.python.org/2/library/stdttypes.html str.splitlines检查这个,明显上尉:"返回字符串中的行列表,[…]换行符不包括在结果列表中。"我认为这是一个关于设计的有效问题,如果答案未知,就不应该是"因为显然一行在末尾有一个'字符&183;。
好吧,这是一条线。行的定义是以字符
结尾。如果字符序列不是以
或eof结尾,我们怎么知道它是一行?
1 2 3
| "hello world"
"hello world
" |
第一行不是行,如果我们打印两次,可能会
hello worldhello world
第二个版本会给我们
1 2
| hello world
hello world |
- 如果您迭代一个可Iterable对象,那么分隔每个项的元素不会包含在每个项的末尾。例如,在csv模块上,您还可以分离迭代它们的元素,结果中不会出现逗号和换行符。