2017-02-01 21 views
3

如果我輸入以下代碼:讀取線和丟棄 「 n」 和 「 L」 尾隨字符

f = open('/etc/issue', 'r') 
out = f.readline() 
f.close() 
print out 

我得到:

Ubuntu 14.04.5 LTS \n \l 

>>> 

如果我輸入:

out = f.readline().strip() 

我得到:

Ubuntu 14.04.5 LTS \n \l 
>>> 

(不換行)

但我怎麼只得到:

Ubuntu 14.04.5 LTS 

沒有 「\ n \ L」?

什麼是「\ l」?

+1

'\ l'是換行符。見[this](http://www.howtogeek。com/89577/how-to-line-breaks-tabs-and-special-characters-in-ms-word /) – nbryans

+0

'f = open('/ etc/issue',r')'a錯字?你錯過了開頭的單引號。 – synchronizer

+0

@synchronizer既然*他確實得到了什麼*這是一個錯字。我編輯了這個問題 –

回答

1

有很多方法。

其中之一是與空字符串替換它們:

f = open('/etc/issue','r') 
out = f.readline() 
out = out.replace('\\n', '').replace('\\l', '').strip() 
f.close() 
print out 

或者擺脫過去的幾個大字:

out = f.readline()[:-6].strip() 
+0

這對我很好 – mebus08

3

\n\l不是特殊字符,它們的一部分文件的內容/etc/issue(見the manpage for issue。它們有一個特殊的含義,你可以檢查the manpage for agetty\n意思是「機器的名稱」和\l「TTY的名稱」。

如果你想在Ubuntu的默認/etc/issue文件得到釋放名稱(注意這個文件進行編輯,以更改登錄終端的外觀),你可以簡單地這樣做:

out = f.readline().split('\\')[0].strip() 

獲取分佈信息是使用有些模糊lsb_release模塊(APT包lsb-release)的更可靠的方式:

import lsb_release 
release_name = lsb_release.get_distro_information()['DESCRIPTION'] 
0

/etc/issue是預登錄消息(消息打印之前登錄提示)。 (參見issuegetty Ubuntu的手冊頁),並且可以包含轉義序列,如兩個字符\n以指示到另一個進程顯示時添加節點名(未換行)和current_tty_name(未換行)。這就是爲什麼你看到\n\l:他們不是單字符轉義換行和換行。

要擺脫他們,你可以使用replace()建議,或做類似的正則表達式,但要注意逃避反斜槓。請注意,man getty列出了十幾個轉義碼。