今天遇到一個問題,同事在 Windows 上作了一個文字檔,

輸入我們的 Linux 程式裡之後,發現每一行都多了一個 byte...

 

其實問題很簡單,因為 Windows/Linux/Mac 的慣用 line-ending 都不一樣,

因此在跨平台時會導致這樣的問題~

 

舉個例子來看,Windows 上製作的文字檔 line-ending 是 CR LF (0d 0a):

testuser@localhost ~ $ hexdump -C line_ending_windows.txt

00000000  6c 69 6e 65 31 0d 0a 6c  69 6e 65 20 32 0d 0a 0d  |line1..line 2...|
00000010  0a 6c 69 6e 65 34 0d 0a                           |.line4..|

 

Unix/Linux 上的 line-ending 是 LF (0a):

testuser@localhost ~ $ hexdump -C line_ending_unix.txt

00000000  6c 69 6e 65 31 0a 6c 69  6e 65 20 32 0a 0a 6c 69  |line1.line 2..li|
00000010  6e 65 34 0a                                       |ne4.|

 

而 Mac 的 line-ending 則是 CR (0d):

testuser@localhost ~ $ hexdump -C line_ending_mac.txt

00000000  6c 69 6e 65 31 0d 6c 69  6e 65 20 32 0d 0d 6c 69  |line1.line 2..li|
00000010  6e 65 34 0d                                       |ne4.|

 

如果在 python 裡面,使用 open() 直接開檔來讀,

會發現 readlines() 在不同平台上,傳回各種不同的結果:

>>> open("line_ending_windows.txt", "r").readlines()
['line1\r\n', 'line 2\r\n', '\r\n', 'line4\r\n']

>>> open("line_ending_unix.txt", "r").readlines()
['line1\n', 'line 2\n', '\n', 'line4\n']

>>> open("line_ending_mac.txt", "r").readlines()
['line1\rline 2\r\rline4\r']

 

若是想要通吃各平台上不同 line-ending 的文字檔,

可以啟用 python 的 Universal Newline Support 的功能~

啟用的方法是在開檔模式裡加一個 "U" 代表 universal newline support,

這樣 python 就會自動辨認正確的 line-ending 來處理了,

可以看到啟用這功能後,readlines() 傳回的資料都是一致的囉:

>>> open("line_ending_windows.txt", "rU").readlines()
['line1\n', 'line 2\n', '\n', 'line4\n']

>>> open("line_ending_unix.txt", "rU").readlines()
['line1\n', 'line 2\n', '\n', 'line4\n']

>>> open("line_ending_mac.txt", "rU").readlines()
['line1\n', 'line 2\n', '\n', 'line4\n']

 

參考資料:stackoverflow: Dealing with Windows line-endings in Python

 

創作者介紹

亂打一通的心情日記

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()