今天在用python讀取txt檔案的時候,遇到了乙個比較坑的問題,那就是「\n」和「\r」究竟有什麼區別?」
在計算機還沒有出現之前,人們設計了一種機器叫做電傳打字機,這種機器每秒鐘可以打10個字元。不過它有個問題,就是打完一行換行的時候,需要0.2s,正好可以列印兩個字元,如果這個時候有新的字元傳過來,那麼這兩個新的字元將會丟失。怎麼辦?研發人員就想了乙個辦法,在每行後面加上兩個表示結束的字元,乙個是「回車(return)」,另乙個是「換行(newline)」。「回車」表示將印表機的列印頭移回到左邊界,「換行」表示將列印紙往上推一行(從而達到列印頭往下移一行的效果)。
通常我們將「\r」稱作回車,而「\n」叫做換行。在windows中,每行的結尾是「\r\n」,而linux中,每行的結尾則是「\n」,在mac中,則只有「\r」。這三者的區別導致了乙個現象的發生:將linux/mac系統下的檔案在windows中開啟時,所有的文字將會變成一行;而將windows裡的檔案在linux/mac中開啟時,則每行的結尾會多乙個^m的符號。
知道了檔案在不同系統下每行結尾所用的符號差異之後,我們就知道如何解決檔案開啟的問題了。比如說,如果我們在windows下開啟某個檔案,發現所有文字變成一行,那麼我們可以使用文字編輯器將裡面的所有「\n」或者「\r」換成「\r\n」。
假如有乙個txt檔案,其中儲存了一些資料,我們想要將這些資料讀取出來,怎麼辦?比如:
data block112
3data block2
4data block3
56
首先,我們需要開啟檔案:
with open(file_path, 'r') as lines:
...
這個時候我們就以唯讀的方式開啟了檔案,並且是一行一行讀取的,如果我們想要將其中的三個資料塊分開怎麼辦?我們可以先用join()方法將這些lines結合為乙個string,然後利用split()方法將它們拆開,但問題是,以什麼樣的標準拆開呢?或者說,給split()傳入什麼引數?這就涉及到該檔案每行以什麼方式結尾了。比方說,如果檔案以「\r\n」結尾,則我們可以這麼寫:
array =
with
open(file_path, 'r') as
lines:
forline
inlines:
array_string = ''.join(array)
data = array_string.split('\r\n\r\n')
通過上面的「\r\n\r\n」我們成功地將三個block分開了。不過這樣做的話,我們得先確認檔案以什麼方式結尾,雖然這並不麻煩( print(list(array)) )就可以了。python為我們提供了乙個不用確認檔案每行結尾的方式:
with open(file_path, 'ru') as lines:
...
u表示通用換行模式(universal new line mode),這種模式將會把所有的換行符(「\r\n」)替換為「\n」,所以我們只需要這樣寫:
array =
with
open(file_path, 'ru') as
lines:
forline
inlines:
array_string = ''.join(array)
data = array_string.split('\n\n')
這樣看起來就開心很多了,不是麼。 簡單的說一說mmap
mmap memory map,就是記憶體對映 簡單的說就是將檔案對映到使用者的位址空間中。這麼做有什麼好處呢?1.傳統檔案訪問方式是,首先用open系統呼叫開啟檔案,然後使用read,write等呼叫進行順序或者隨即的i o.這種方式是非常低效的,每一次i o操作都需要一次系統呼叫.而通過mmap...
說一說JS的IIFE
iife immediately invoked function expression,意為立即呼叫的函式表示式,也就是說,宣告函式的同時立即呼叫這個函式。對比一下,這是不採用iife時的函式宣告和函式呼叫 function foo foo 下面是iife形式的函式呼叫 functionfoo 函...
說一說JS的IIFE
iife immediately invoked function expression,意為立即呼叫的函式表示式,也就是說,宣告函式的同時立即呼叫這個函式。對比一下,這是不採用iife時的函式宣告和函式呼叫 function foo window console.log a 2 js的模組就是函式...