2016-01-22 17 views
0

(注:我並不想改變什麼 - 只是想了解)爲什麼[line in open(「text.txt」)]會產生換行符?

望着解決方案,在Python中的文件中讀取,每一次換行字符應該扒掉:

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

雖然直覺行爲(判斷一些questions關於此的流行)將只是產生剝離線?

這背後的基本原理是什麼?

- 編輯 -

授予:'直覺'是主觀的。然而,「一致」並不如此。顯然,在"line1\nline2".splitlines()的「行」的概念是不同的一個比一個由iter(open("text.txt"))處理:

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

很肯定的人得到由該抓。

所以我誤會了:也許我的直覺是符合splitlines的解釋:分裂的東西不應該包括分隔符。也許我的問題的答案不是技術性的,而更像是「自PEP-xyz被不同的人批准而不是PEP-qrs」。也許我應該把它發佈到一些Python語言論壇。

+3

「的人不」很多不期望獲得換行「並不一定意味着這是直觀的設計。也許換行符的數量比換行符的數量多一百比一 - 你只是不知道它,因爲它們都沒有在帖子上寫道:「我使用了'in line in file',它給了我完全我認爲會的東西」 – Kevin

+2

I會讀[Python的禪](https://www.python.org/dev/peps/pep-0020/) - 它聲明「顯式比隱式更好」。在某些情況下隱含剝離新行可能不起作用,例如將這些行寫入另一個文件。 – AChampion

+1

我相信一些大的,重要的機構決定,一行是以預定義字符或字符集合(換行符)結尾的字符序列。這意味着「line1」實際上並不是一條線,也是爲什麼有些人認爲沒有尾隨換行符的文件是無效的。 –

回答

1

嗯,這是一條線。一行以字符\n結尾。如果一串字符沒有以\n(或EOF)結尾,我們怎麼能知道它是一條線?

"hello world" 
"hello world\n" 

首先是不是一條線,如果我們打印了兩次,我們可能會得到

hello worldhello world

詭計的第二個版本會給我們

hello world 
hello world 
+1

我期望如果迭代一個迭代對象中,分隔每個項目的元素不會包含在每個項目的末尾,例如,在csv模塊上,您還可以分離迭代它們的元素,並且逗號和換行符不會出現在結果中。 – dyeray

相關問題