執行以下Python代碼:
fn = 'test.txt'
file(fn, 'w+').write('test\ntest2')
content = file(fn, 'r').read()
print content.replace('\r', '\\r').replace('\n', '\\n')
列印的結果不依賴平台,都是:
test\ntest2
但是test.txt的內容卻依賴平台而變化(用notepad++、vi等程式查看):
windows下是:test\r\ntest2
linux下卻是:test\ntest2
我想問的問題是,如何保證Python寫入檔案的'\n'字元不隨平台變化,即保證一定是'\n'?
回複內容:
章碩,js & python
夏一一、喬3少 贊同
這不是python的問題,windows的換行是\r\n,unix的是\n,mac的是\r。
這是一個很經典的問題。因為不同系統下預設的分行符號不同。字元處理時候,這樣的“不同”會帶來很大的問題,例如line[-2]和line.strpi()會因為平台不同返回不同的值。
解決方案:
Python 2
(PEP 278 -- Universal Newline Support
,感謝畢勤的補充
):
1)如果不是txt檔案,建議用wb和rb來讀寫。通過二進位讀寫,不會有換行問題。
2)如果需要明文內容,請用rU來讀取(
強烈推薦),即
U通用換行模式(Universal new line mode)。
該模式會把所有的分行符號(\r \n \r\n)替換為\n。只支援讀入,但是也足夠了。這是Python 提供給我們的最好的選擇,沒有之一。
對比r和rU的結果:
content = file(fn, 'r').read()# test\r\ntest2# 這裡的換行會因不同系統而不同
file(fn, 'w+').write('test\ntest2')
改成
file(fn, 'wb+').write('test\ntest2')
就行了。Windows 平台上 Python 區分 Binary 和 ASCII 模式。ASCII 模式下分行符號會在讀寫時自動換為 \r\n (詳見 [1])。*nix 平台下沒有這個區別。
[1]: http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files
python可以根據系統自動選擇分行符號,只要使用 os.linesep 就可以判斷出來 這不是python的問題,windows的換行是\r\n,unix的是\n,mac的是\r。 回答除了第一個都略微偏題了. 個人習慣來說,當編輯檔案時,盡量使用二進位格式,這樣會避免跨平台時出錯. 根本不需要知道每個平台是\r,還是\n. 只要養成 rb,wb等習慣就行了. Rio 就是一個很好的編程習慣.不特別指定的話,python會自適應各個平台的差異,比如\n 和 \r\n的不同。
想達到樓主的目地,可以用二進位模式開啟和操作檔案即可。現在這個答案已經錯了0.0,正確如下(在不可預見的未來,這個答案也很可能錯了,期待有人@我)。
在遠古時代:windows的換行是\r\n,unix的是\n,mac的是\r完全正確!
Mac OS 9 以及之前的系統的分行符號是 CR(\r),從 Mac OS X (後來改名為“OS X”)開始的分行符號是 LF(\n)。
參考Did Mac OS Lion switch to using line feeds (LF '\n') for line breaks instead of carriage returns (CR '\r')?
我知道的一點是:CLRF結尾的檔案可以用【dos2unix】命令轉換為RF結尾的檔案。