2011-08-16 58 views
3

我在家中使用電腦,工作時使用Mac電腦。我從來沒有在python腳本或其輸出中使用換行符時遇到任何問題,但是每當我向我的老闆發送一些東西時,我都會收到一封憤怒的電子郵件,內容是關於windows的換行符。確實在Python中插入' r n'時被告知插入' n'?

最近的是python腳本的輸出,我告訴它用'\ n'結束每一行,但仔細檢查(在我的Mac上工作),似乎每行確實結束與'\ r \ n'。

怎麼回事,我該如何阻止它?我曾經在家中的Linux虛擬機上運行過所有的腳本,但是我發現它太慢而且太煩瑣,當然有一個更簡單的解決方法?

回答

9

這是因爲您的文件以文本模式打開,並且Python根據您使用的平臺(Windows使用\r\n和Linux僅使用\n)正常化了換行符。你需要以二進制方式打開文件是這樣的:

f = open("myfile.txt","wb") 

它在相反的事情,當你閱讀文件(\r\n\n更換),除非你也指定二進制模式:

f = open("myfile.txt", "rb") 
+1

我仍然可以直接寫文本給他們,就像我打開它們爲'w'一樣嗎? – Kirt

+2

是的,文本和二進制模式之間的唯一區別在於文本模式規範了新行。 –

1

您看到的行爲不是python特有的。它來自C標準庫中緩衝的文件處理函數,它是python和其他高級語言的基礎。除非被告知不要,否則在寫入時會將換行符轉換爲當前平臺的原生文本文件換行符序列,並在讀取時進行相反操作。有關詳細信息,請參閱本地系統上fopen()的文檔。在Windows上,這意味着\ n將在寫入時轉換爲\ r \ n。

python文檔提到新行轉換和其他open()模式選項here

打開輸出文件時,一種解決方案是使用open("filename", "wb")而不是open("filename", "w")。這將避免自動換行。只要你的老闆使用某種形式的unix(包括OSX),它就應該爲你的老闆解決問題。不幸的是,這也將意味着某些Windows的文本編輯器(如記事本?)會出現奇怪的文件:

 
Windows acts like a teletype 
          when it sees new lines 
                without carriage returns. 

另一種方法是轉換文件將它們發送到人誰不使用Windows之前需要。爲此目的存在各種轉換程序,例如dos2unixflip