day09

一 文件操做 (----------------------------------------------------------------------)python

一 介紹vim

計算機系統分爲:計算機硬件,操做系統,應用程序三部分。數據結構

咱們用python或其餘語言編寫的應用程序若想要把數據永久保存下來,必需要保存於硬盤中,這就涉及到應用程序要操做硬件,衆所周知,應用程序是沒法直接操做硬件的,這就用到了操做系統。操做系統把複雜的硬件操做封裝成簡單的接口給用戶/應用程序使用,其中文件就是操做系統提供給應用程序來操做硬盤虛擬概念,用戶或應用程序經過操做文件,能夠將本身的數據永久保存下來。app

有了文件的概念,咱們無需再去考慮操做硬盤的細節,只須要關注操做文件的流程:編輯器

#1. 打開文件,獲得文件句柄並賦值給一個變量
#2. 經過句柄對文件進行操做
#3. 關閉文件

二 在python中函數

#1. 打開文件,獲得文件句柄並賦值給一個變量
f=open('a.txt','r',encoding='utf-8') #默認打開模式就爲r

#2. 經過句柄對文件進行操做
data=f.read()

#3. 關閉文件
f.close()

三 f=open('a.txt','r')的過程分析工具

#一、由應用程序向操做系統發起系統調用open(...)

#二、操做系統打開該文件,並返回一個文件句柄給應用程序

#三、應用程序將文件句柄賦值給變量f

二 打開文件的模式

文件句柄 = open('文件路徑', '模式')

模式能夠是如下方式以及他們之間的組合:測試

Character Meaning
‘r' open for reading (default)
‘w' open for writing, truncating the file first
‘a' open for writing, appending to the end of the file if it exists
‘b' binary mode
‘t' text mode (default)
‘+' open a disk file for updating (reading and writing)
‘U' universal newline mode (for backwards compatibility; should not be used in new code)
#1. 打開文件的模式有(默認爲文本模式):
r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
w,只寫模式【不可讀;不存在則建立;存在則清空內容】
a, 之追加寫模式【不可讀;不存在則建立;存在則只追加內容】

#2. 對於非文本文件,咱們只能使用b模式,"b"表示以字節的方式操做(而全部文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
rb 
wb
ab
注:以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,不能指定編碼

#3. 瞭解部分
"+" 表示能夠同時讀寫某個文件
r+, 讀寫【可讀,可寫】
w+,寫讀【可讀,可寫】
a+, 寫讀【可讀,可寫】


x, 只寫模式【不可讀;不存在則建立,存在則報錯】
x+ ,寫讀【可讀,可寫】
xb

三 操做文件的方法

#掌握
f.read() #讀取全部內容,光標移動到文件末尾
f.readline() #讀取一行內容,光標移動到第二行首部
f.readlines() #讀取每一行內容,存放於列表中

f.write('1111\n222\n') #針對文本模式的寫,須要本身寫換行符
f.write('1111\n222\n'.encode('utf-8')) #針對b模式的寫,須要本身寫換行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

#瞭解
f.readable() #文件是否可讀
f.writable() #文件是否可讀
f.closed #文件是否關閉
f.encoding #若是文件打開模式爲b,則沒有該屬性
f.flush() #馬上將文件內容從內存刷到硬盤
f.name

四 文件內光標移動

一: read(3):編碼

  1. 文件打開方式爲文本模式時,表明讀取3個字符操作系統

  2. 文件打開方式爲b模式時,表明讀取3個字節

二: 其他的文件內光標移動都是以字節爲單位如seek,tell,truncate

注意:

  1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但不管哪一種模式,都是以bytes爲單位移動的

  2. truncate是截斷文件,因此文件的打開方式必須可寫,可是不能用w或w+等方式打開,由於那樣直接清空文件了,因此truncate要在r+或a或a+等模式下測試效果

五 文件的修改

文件的數據是存放於硬盤上的,於是只存在覆蓋、不存在修改這麼一說,咱們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式:

方式一:將硬盤存放的該文件的內容所有加載到內存,在內存中是能夠修改的,修改完畢後,再由內存覆蓋到硬盤(word,vim,nodpad++等編輯器)

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #所有讀入內存,若是文件很大,會很卡
    data=data.replace('alex','SB') #在內存中完成修改

    write_f.write(data) #一次性寫入新文件

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')

方式二:將硬盤存放的該文件的內容一行一行地讀入內存,修改完畢就寫入新文件,最後用新文件覆蓋源文件

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')

1. Lambda 函數

Lambda 函數是一種比較小的匿名函數——匿名是指它實際上沒有函數名。

Python 函數一般使用 def a_function_name() 樣式來定義,但對於 lambda 函數,咱們根本沒爲它命名。這是由於 lambda 函數的功能是執行某種簡單的表達式或運算,而無需徹底定義函數。

lambda 函數可使用任意數量的參數,但表達式只能有一個。

2. Map 函數

Map() 是一種內置的 Python 函數,它能夠將函數應用於各類數據結構中的元素,如列表或字典。對於這種運算來講,這是一種很是乾淨並且可讀的執行方式。

3. Filter 函數

filter 內置函數與 map 函數很是類似,它也將函數應用於序列結構(列表、元組、字典)。兩者的關鍵區別在於 filter() 將只返回應用函數返回 True 的元素。

咱們不只評估了每一個列表元素的 True 或 False,filter() 函數還確保只返回匹配爲 True 的元素。很是便於處理檢查表達式和構建返回列表這兩步。

4. Itertools 模塊

Python 的 Itertools 模塊是處理迭代器的工具集合。迭代器是一種能夠在 for 循環語句(包括列表、元組和字典)中使用的數據類型。

使用 Itertools 模塊中的函數讓你能夠執行不少迭代器操做,這些操做一般須要多行函數和複雜的列表理解。關於 Itertools 的神奇之處,請看如下示例:

5. Generator 函數

Generator 函數是一個相似迭代器的函數,即它也能夠用在 for 循環語句中。這大大簡化了你的代碼,並且相比簡單的 for 循環,它節省了不少內存。

好比,咱們想把 1 到 1000 的全部數字相加,如下代碼塊的第一部分向你展現瞭如何使用 for 循環來進行這一計算。

若是列表很小,好比 1000 行,計算所需的內存還行。但若是列表巨長,好比十億浮點數,這樣作就會出現問題了。使用這種 for 循環,內存中將出現大量列表,但不是每一個人都有無限的 RAM 來存儲這麼多東西的。Python 中的 range() 函數也是這麼幹的,它在內存中構建列表。

代碼中第二部分展現了使用 Python generator 函數對數字列表求和。generator 函數建立元素,並只在必要時將其存儲在內存中,即一次一個。這意味着,若是你要建立十億浮點數,你只能一次一個地把它們存儲在內存中!Python 2.x 中的 xrange() 函數就是使用 generator 來構建列表。

若是你想對列表進行屢次迭代,而且它足夠小,能夠放進內存,那最好使用 for 循環或 Python 2.x 中的 range 函數。由於 generator 函數和 xrange 函數將會在你每次訪問它們時生成新的列表值,而 Python 2.x range 函數是靜態的列表,並且整數已經置於內存中,以便快速訪問。

相關文章
相關標籤/搜索