說一說 r與 n

2021-08-17 04:59:07 字數 1796 閱讀 3848

今天在用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的模組就是函式...