2016-06-28 32 views
14

Python的操作系統模塊包含一個特定平臺的分界線字符串值,但該文檔明確地說,不寫文件時使用它:什麼是os.linesep?

寫入文件時,不要使用os.linesep作爲一個行終止在文本模式下打開(默認);在所有平臺上使用單個'\ n'。

Docs

Previous questions已經探索了,爲什麼你不應在這種情況下使用它,但當時什麼情況下是它有用嗎?你什麼時候應該使用行分隔符,併爲什麼?

回答

7

的文檔明確地說,不使用它寫入到文件

時,這是不準確的,該醫生說不能用它在文本模式。

os.linesep用於當您要遍歷文本文件的行時。內部掃描儀識別os.linesep,並將其替換爲單個「\ n」。

爲了說明,我們寫出包含由 「\ r \ n」 個(視窗分隔符)隔開3行的二進制文件:

import io 

filename = "text.txt" 

content = b'line1\r\nline2\r\nline3' 
with io.open(filename, mode="wb") as fd: 
    fd.write(content) 

二進制文件的內容是:

with io.open(filename, mode="rb") as fd: 
    for line in fd: 
     print(repr(line)) 

注意:我使用「rb」模式將文件讀取爲二進制文件。

我得到:

b'line1\r\n' 
b'line2\r\n' 
b'line3' 

如果我使用文本模式讀取文件的內容,就像這樣:

with io.open(filename, mode="r", encoding="ascii") as fd: 
    for line in fd: 
     print(repr(line)) 

我得到:

'line1\n' 
'line2\n' 
'line3' 

分隔符由「\ n」替換。

os.linesep也用於寫模式:任何 「\ n」 字符被轉換成系統默認在線分離器:爲 「\ r \ n」 個在Windows, 「\ n」 個上POSIX等

使用io.open函數,您可以強制任何你想要的行分隔符。

例如:如何寫一個Windows的文本文件:

with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd: 
    fd.write("one\ntwo\nthree\n") 

如果你閱讀的文本模式下,該文件是這樣的:

with io.open(filename, mode="rb") as fd: 
    content = fd.read() 
    print(repr(content)) 

你得到:

b'one\r\ntwo\r\nthree\r\n' 
4

如您所知,在python中以文本模式讀取和寫入文件會將平臺特定的行分隔符轉換爲'\ n',反之亦然。但是,如果您要以二進制模式讀取文件,則不會發生轉換。然後,您可以使用string.replace(os.linesep, '\n')明確轉換行結束符。如果文件(或流或其他)包含二進制文本和文本數據的組合,這可能很有用。

+0

它止跌如果編碼與ASCII不兼容,則不起作用。 'len('\ n'.encode('utf-16'))'是4 –

相關問題