Python基础知识(第十天)
135.file文件操作_操作系統(tǒng)底層關(guān)系_寫入文件
文本文件和二進(jìn)制文件
按文件中數(shù)據(jù)組織形式,我們把文件分為文本文件和二進(jìn)制文件兩大類。
1.文本文件
文本文件存儲(chǔ)的是普通“字符”文本,python?默認(rèn)為 unicode?字符集(兩個(gè)字節(jié)表示一個(gè)字符,最多可以表示:65536?個(gè)),可以使用記事本程序打開(kāi)。但是,像 word?軟件編輯的文檔不是文本文件。
2.二進(jìn)制文件
二進(jìn)制文件把數(shù)據(jù)內(nèi)容用“字節(jié)”進(jìn)行存儲(chǔ),無(wú)法用記事本打開(kāi)。必須使用專用的軟件解碼。常見(jiàn)的有:MP4?視頻文件、MP3?音頻文件、JPG?圖片、doc?文檔等等。
文件操作相關(guān)模塊概述
Python 標(biāo)準(zhǔn)庫(kù)中,如下是文件操作相關(guān)的模塊,我們會(huì)陸續(xù)給大家介紹。
| 名稱 | 說(shuō)明 |
| io 模塊 | 文件流的輸入和輸出操作?input output |
| os 模塊 | 基本操作系統(tǒng)功能,包括文件操作 |
| glob 模塊 | 查找符合特定規(guī)則的文件路徑名 |
| fnmatch 模塊 | 使用模式來(lái)匹配文件路徑名 |
| fileinput 模塊 | 處理多個(gè)輸入文件 |
| filecmp 模塊 | 用于文件的比較 |
| cvs 模塊 | 用于 csv 文件處理 |
| pickle 和 cPickle | 用于序列化和反序列化 |
| xml 包 | 用于 XML 數(shù)據(jù)處理 |
| bz2、gzip、zipfile、zlib、tarfile | 用于處理壓縮和解壓縮文件(分別對(duì)應(yīng)不同的算法) |
創(chuàng)建文件對(duì)象 open()
open()函數(shù)用于創(chuàng)建文件對(duì)象,基本語(yǔ)法格式如下:
open(文件名[,打開(kāi)方式])
如果只是文件名,代表在當(dāng)前目錄下的文件。文件名可以錄入全路徑,比如:D:\a\b.txt。為了減少“\”的輸入,可以使用原始字符串:r“d:\b.txt”。示例如下:
f = open(r"d:\b.txt","w")
| 模式 | 描述 |
| r | 讀 read 模式 |
| w | 寫 write 模式。如果文件不存在則創(chuàng)建;如果文件存在,則重寫新內(nèi)容; |
| a | 追加 append 模式。如果文件不存在則創(chuàng)建;如果文件存在,則在文件末尾追加內(nèi)容 |
| b | 二進(jìn)制 binary 模式(可與其他模式組合使用) |
| + | 讀、寫模式(可與其他模式組合使用) |
文本文件對(duì)象和二進(jìn)制文件對(duì)象的創(chuàng)建:
如果我們沒(méi)有增加模式“b”,則默認(rèn)創(chuàng)建的是文本文件對(duì)象,處理的基本單元是“字符”。如果是二進(jìn)制模式“b”,則創(chuàng)建的是二進(jìn)制文件對(duì)象,處理的基本單元是“字節(jié)”。
文本文件的寫入
文本文件的寫入一般就是三個(gè)步驟:
1.創(chuàng)建文件對(duì)象
2.寫入數(shù)據(jù)
3.關(guān)閉文件對(duì)象
python——> 解釋器——>操作系統(tǒng)——>硬盤
f = open(r"/Users/zhucan/Desktop/aaw.txt","a") s = "itbaizhan\nsxt\n" f.write(s) f.close()136.編碼知識(shí)_中文亂碼問(wèn)題解決
編碼知識(shí)
ASCII
全稱為 American Standard Code for Information Interchange,美國(guó)信息交換標(biāo)準(zhǔn)代碼,這是世界上最早最通用的單字節(jié)編碼系統(tǒng),主要用來(lái)顯示現(xiàn)代英語(yǔ)及其他西歐語(yǔ)言。
ASCII?碼用 7?位表示,只能表示 128?個(gè)字符。只定義了 27=128?個(gè)字符,用7bit?即可完全編碼,而一字節(jié) 8bit?的容量是 256,所以一字節(jié) ASCII?的編碼最高位總是 0。
0~31?表示控制字符如回車、退格、刪除等;32~126?表示打印字符即可以通過(guò)鍵盤輸入并且能顯示出來(lái)的字符; 其中 48~57?為 0?到 9?十個(gè)阿拉伯?dāng)?shù)字, 65~90?為 26?個(gè)大寫英文字母,97~122?號(hào)為 26?個(gè)小寫英文字母,其余為一些標(biāo)點(diǎn)符號(hào)、運(yùn)算符號(hào)等,具體可以參考 ASCII?標(biāo)準(zhǔn)表(大家自行百度,不在此贅述)。
ISO8859-1
ISO-8859-1 又稱 Latin-1,是一個(gè) 8 位單字節(jié)字符集,它把 ASCII 的最高位也利用起來(lái),并兼容了 ASCII,新增的空間是 128,但它并沒(méi)有完全用完。
在 ASCII?編碼之上又增加了西歐語(yǔ)言、希臘語(yǔ)、泰語(yǔ)、阿拉伯語(yǔ)、希伯來(lái)語(yǔ)對(duì)應(yīng)的文字符號(hào),它是向下兼容 ASCII?編碼
GB2312
GB2312 全稱為信息交換用漢字編碼字符集,是中國(guó)于 1980 年發(fā)布,主要用于計(jì)算機(jī)系統(tǒng)中的漢字處理。GB2312?主要收錄了 6763?個(gè)漢字、682?個(gè)符號(hào)。
GB2312?覆蓋了漢字的大部分使用率,但不能處理像古漢語(yǔ)等特殊的罕用字, 所以后來(lái)出現(xiàn)了像 GBK、GB18030?這種編碼。GB2312 完全兼容 ISO8859-1。
GBK
全稱為?Chinese?Internal?Code?Specification,即漢字內(nèi)碼擴(kuò)展規(guī)范,于?1995?年制定。它主要是擴(kuò)展了 GB2312,在它的基礎(chǔ)上又加了更多的漢字,它一共收錄了 21003?個(gè)漢字
GB18030
現(xiàn)在最新的內(nèi)碼字集于 2000 年發(fā)布,并于 2001 年強(qiáng)制執(zhí)行,包含了中國(guó)大部分少數(shù)民族的語(yǔ)言字符,收錄漢字?jǐn)?shù)超過(guò) 70000 余個(gè)。
它主要采用單字節(jié)、雙字節(jié)、四字節(jié)對(duì)字符編碼,它是向下兼容 GB2312?和 GBK?的, 雖然是我國(guó)的強(qiáng)制使用標(biāo)準(zhǔn),但在實(shí)際生產(chǎn)中很少用到,用得最多的反而是 GBK?和 GB2312
Unicode
Unicode?編碼設(shè)計(jì)成了固定兩個(gè)字節(jié),所有的字符都用 16?位(2^16=65536) 表示,包括之前只占 8?位的英文字符等,所以會(huì)造成空間的浪費(fèi),UNICODE?在很長(zhǎng)的一段時(shí)間內(nèi)都沒(méi)有得到推廣應(yīng)用。Unicode 完全重新設(shè)計(jì),不兼容 iso8859-1,也不兼容任何其他編碼。
UTF-8
對(duì)于英文字母,unicode 也需要兩個(gè)字節(jié)來(lái)表示。所以 unicode 不便于傳輸和存儲(chǔ)。因此而產(chǎn)生了 UTF 編碼,UTF-8 全稱是(8-bit Unicode Transformation Format)。UTF?編碼兼容 iso8859-1?編碼,同時(shí)也可以用來(lái)表示所有語(yǔ)言的字符, 不過(guò),UTF 編碼是不定長(zhǎng)編碼,每一個(gè)字符的長(zhǎng)度從 1-4?個(gè)字節(jié)不等。其中, 英文字母都是用一個(gè)字節(jié)表示,而漢字使用三個(gè)字節(jié)。
【老鳥(niǎo)建議】一般項(xiàng)目都會(huì)使用 UTF-8。unicode?中雖然漢字是兩個(gè)字節(jié), UTF-8?中漢字是 3 個(gè)字節(jié)。但是互聯(lián)網(wǎng)中一個(gè)網(wǎng)頁(yè)也包含了大量的英文字母, 這些英文字母只占用 1?個(gè)字節(jié),整體占用空間,UTF-8?仍然優(yōu)于 Unicode。
中文亂碼問(wèn)題
亂碼——解碼和編碼不一致
windows?操作系統(tǒng)默認(rèn)的編碼是 GBK,Linux?操作系統(tǒng)默認(rèn)的編碼是 UTF-8。當(dāng)我們用 open()時(shí),調(diào)用的是操作系統(tǒng)打開(kāi)的文件,默認(rèn)的編碼是 GBK。python默認(rèn)unicode。
137.關(guān)閉流要點(diǎn)1_try異常管理
write()/writelines()寫入數(shù)據(jù)
write(a):把字符串 a 寫入到文件中
writelines(b):把字符串列表寫入文件中,不添加換行符
close()關(guān)閉文件流
由于文件底層是由操作系統(tǒng)控制,所以我們打開(kāi)的文件對(duì)象必須顯式調(diào)用 close()方法關(guān)閉文件對(duì)象。當(dāng)調(diào)用 close()方法時(shí),首先會(huì)把緩沖區(qū)數(shù)據(jù)寫入文件(也可以直接調(diào)用 flush() 方法),再關(guān)閉文件,釋放文件對(duì)象。
為了確保打開(kāi)的文件對(duì)象正常關(guān)閉,一般結(jié)合異常機(jī)制的 finally?或者 with?關(guān)鍵字實(shí)現(xiàn)無(wú)論何種情況都能關(guān)閉打開(kāi)的文件對(duì)象。
結(jié)合異常機(jī)制 finally 確保關(guān)閉文件對(duì)象
try:f = open(r"my01.txt","a")str = "gaoqi"f.write(str) except BaseException as e:print(e) finally:f.close()138.關(guān)閉流要點(diǎn)2_with上下文管理_現(xiàn)場(chǎng)還原
with 關(guān)鍵字(上下文管理器)可以自動(dòng)管理上下文資源,不論什么原因跳出 with 塊,都能確保文件正確的關(guān)閉,并且可以在代碼塊執(zhí)行完畢后自動(dòng)還原進(jìn)入該代碼塊時(shí)的現(xiàn)場(chǎng)。
with open(r"a.txt","a") as f:f.write("gaoqi")139.文本文件的讀取
文件的讀取一般使用如下三個(gè)方法:
1.read([size])
從文件中讀取 size 個(gè)字符,并作為結(jié)果返回。如果沒(méi)有 size 參數(shù),則讀取整個(gè)文件。讀取到文件末尾,會(huì)返回空字符串。中文英文都是一個(gè)字符
2.readline()
讀取一行內(nèi)容作為結(jié)果返回。讀取到文件末尾,會(huì)返回空字符串。
3.readlines()
文本文件中,每一行作為一個(gè)字符串存入列表中,返回該列表
with open(r"a.txt","r") as f:print(f.read())?迭代器
with open(r"a.txt","r") as f:for a in f:print(a,end="") with open(r"a.txt","r") as f:while True:fragment = f.readline()if not fragment:breakelse:print(fragment,end="")140.enumerate()函數(shù)和推導(dǎo)式生成列表_操作每行增加行號(hào)
a=["I want you\n","abc\n","gaoqi\n"] b=enumerate(a) print(a) print(list(b)) ['I want you\n', 'abc\n', 'gaoqi\n'] [(0, 'I want you\n'), (1, 'abc\n'), (2, 'gaoqi\n')] with open(r"a.txt","r") as f:lines=f.readlines()lines=[line.rstrip()+" #"+str(index+1)+"\n" for index,line in enumerate(lines)] with open(r"a.txt","w") as f:f.writelines(lines)141.二進(jìn)制文件的讀寫_圖片文件拷貝
二進(jìn)制文件的處理流程和文本文件流程一致。首先還是要?jiǎng)?chuàng)建文件對(duì)象,不過(guò),我們需要指定二進(jìn)制模式,從而創(chuàng)建出二進(jìn)制文件對(duì)象。例如:
f = open(r"d:\a.txt", 'wb') ?????#可寫的、重寫模式的二進(jìn)制文件對(duì)象
f = open(r"d:\a.txt", 'ab') ?????#可寫的、追加模式的二進(jìn)制文件對(duì)象
f = open(r"d:\a.txt", 'rb')? ? ? ?#可讀的二進(jìn)制文件對(duì)象
創(chuàng)建好二進(jìn)制文件對(duì)象后,仍然可以使用 write()、read()實(shí)現(xiàn)文件的讀寫操作。
with open('aa.gif', 'rb') as f:with open('aa_copy.gif', 'wb') as w:for line in f.readlines():w.write(line) print('圖片拷貝完成!')142.文件對(duì)象常用方法和屬性總結(jié)_seek()任意位置操作
文件對(duì)象的打開(kāi)模式
| 模式 | 說(shuō)明 |
| r | 讀模式 |
| w | 寫模式 |
| a | 追加模式 |
| b | 二進(jìn)制模式(可與其他模式組合) |
| + | 讀寫模式(可以其他模式組合) |
文件對(duì)象的常用方法
| 方法名 | 說(shuō)明 |
| read([size]) | 從文件中讀取 size 個(gè)字節(jié)或字符的內(nèi)容返回。若省略[size],則讀 取到文件末尾,即一次讀取文件所有內(nèi)容 |
| readline() | 從文本文件中讀取一行內(nèi)容 |
| readlines() | 把文本文件中每一行都作為獨(dú)立的字符串對(duì)象,并將這些對(duì)象放入 列表返回 |
| write(str) | 將字符串 str 內(nèi)容寫入文件 |
| writelines(s) | 將字符串列表 s 寫入文件文件,不添加換行符 |
| seek(offset[,whence]) | 把文件指針移動(dòng)到新的位置,offset?表示相對(duì)于?whence?的多少個(gè) 字節(jié)的偏移量; offset: off 為正往結(jié)束方向移動(dòng),為負(fù)往開(kāi)始方向移動(dòng)whence不同的值代表不同含義: 0: 從文件頭開(kāi)始計(jì)算(默認(rèn)值) 1:從當(dāng)前位置開(kāi)始計(jì)算 2:從文件尾開(kāi)始計(jì)算 |
| tell() | 返回文件指針的當(dāng)前位置 |
| truncate([size]) | 不論指針在什么位置,只留下指針前 size 個(gè)字節(jié)的內(nèi)容,其余全部刪除; 如果沒(méi)有傳入 size,則當(dāng)指針當(dāng)前位置到文件末尾內(nèi)容全部刪除 |
| flush() | 把緩沖區(qū)的內(nèi)容寫入文件,但不關(guān)閉文件 |
| close() | 把緩沖區(qū)內(nèi)容寫入文件,同時(shí)關(guān)閉文件,釋放文件對(duì)象相關(guān)資源 |
143.使用pickle實(shí)現(xiàn)序列化和反序列化_神經(jīng)元記憶移植
Python?中,一切皆對(duì)象,對(duì)象本質(zhì)上就是一個(gè)“存儲(chǔ)數(shù)據(jù)的內(nèi)存塊”。有時(shí)候,我們需要將“內(nèi)存塊的數(shù)據(jù)”保存到硬盤上,或者通過(guò)網(wǎng)絡(luò)傳輸?shù)狡渌挠?jì)算機(jī)上。這時(shí)候,就需要“對(duì)象的序列化和反序列化”。 對(duì)象的序列化機(jī)制廣泛的應(yīng)用在分布式、并行系統(tǒng)上。
序列化指的是:將對(duì)象轉(zhuǎn)化成“串行化”數(shù)據(jù)形式,存儲(chǔ)到硬盤或通過(guò)網(wǎng)絡(luò)傳輸?shù)狡渌胤健7葱蛄谢侵赶喾吹倪^(guò)程,將讀取到的“串行化數(shù)據(jù)”轉(zhuǎn)化成對(duì)象。我們可以使用 pickle 模塊中的函數(shù),實(shí)現(xiàn)序列化和反序列操作。
pickle.dump(obj,?file)? ? ? ? ? ? ?obj就是要被序列化的對(duì)象,file指的是存儲(chǔ)的文件
pickle.load(file)? ? ? ? ? ? ? ? 從file讀取數(shù)據(jù),反序列化成對(duì)象
import pickle a1 = "高淇" a2 = 234 a3 = [20,30,40] with open("data.dat","wb") as f:pickle.dump(a1,f)pickle.dump(a2,f)pickle.dump(a3,f)with open("data.dat","rb") as f:b1=pickle.load(f)b2=pickle.load(f)b3=pickle.load(f)print(b1)print(b2)print(b3)print(id(a1))print(id(b1)) 高淇 234 [20, 30, 40] 140569047046736 140569047163312144.CSV文件的讀取_寫入
csv(Comma Separated Values)是逗號(hào)分隔符文本格式,常用于數(shù)據(jù)交換、Excel 文件和數(shù)據(jù)庫(kù)數(shù)據(jù)的導(dǎo)入和導(dǎo)出。與 Excel 文件不同,CSV 文件中:
(1)值沒(méi)有類型,所有值都是字符串
(2)不能指定字體顏色等樣式
(3)不能指定單元格的寬高,不能合并單元格
(4)沒(méi)有多個(gè)工作表
(5)不能嵌入圖像圖表
Python 標(biāo)準(zhǔn)庫(kù)的模塊 csv 提供了讀取和寫入 csv 格式文件的對(duì)象。
我們?cè)?excel 中建立一個(gè)簡(jiǎn)單的表格:
另存為"csv(逗號(hào)分隔)",我們打開(kāi)查看這個(gè) csv 文件內(nèi)容:
姓名,年齡,工作,薪水
高淇,18,程序員,50000
高老三,19,測(cè)試工程師,20000
高老五,20,人工智能開(kāi)發(fā),50000
import csv with open("dd.csv","r") as f:a_csv=csv.reader(f)print(list(a_csv))for row in a_csv:print(row) import csv with open("ee.csv","w") as f:b_csv=csv.writer(f)b_csv.writerow(["ID","姓名","年齡"])b_csv.writerows(["ID","姓名","年齡"],["1001","高崎","18"])145.os模塊_調(diào)用操作系統(tǒng)可執(zhí)行文件_控制臺(tái)亂碼問(wèn)題
os 模塊可以幫助我們直接對(duì)操作系統(tǒng)進(jìn)行操作。我們可以直接調(diào)用操作系統(tǒng)的可執(zhí)行文件、命令,直接操作文件、目錄等等。在系統(tǒng)運(yùn)維的核心基礎(chǔ)。
os.system 調(diào)用 windows 系統(tǒng)的記事本程序
import os os.system("notepad.exe")os.system 調(diào)用 windows 系統(tǒng)中 ping 命令
import os os.system("ping www.baidu.com")?直接調(diào)用可執(zhí)行的文件
import os os.startfile(r"")146.os模塊_獲得文件信息_創(chuàng)建文件夾_遞歸創(chuàng)建
我們可以通過(guò)前面講的文件對(duì)象實(shí)現(xiàn)對(duì)于文件內(nèi)容的讀寫操作。如果,還需要對(duì)文件和目錄做其他操作,可以使用 os 和 os.path 模塊。
os 模塊下常用操作文件的方法
| 方法名 | 描述 |
| remove(path) | 刪除指定的文件 |
| rename(src,dest) | 重命名文件或目錄 |
| stat(path) | 返回文件的所有屬性 |
| listdir(path) | 返回 path 目錄下的文件和目錄列表 |
os 模塊下關(guān)于目錄操作的相關(guān)方法,匯總?cè)缦?#xff1a;
| 方法名 | 描述 |
| mkdir(path) | 創(chuàng)建目錄 |
| makedirs(path1/path2/path3/...) | 創(chuàng)建多級(jí)目錄 |
| rmdir(path) | 刪除目錄 |
| removedirs(path1/path2...) | 刪除多級(jí)目錄 |
| getcwd() | 返回當(dāng)前工作目錄:current work dir |
| chdir(path) | 把 path 設(shè)為當(dāng)前工作目錄 |
| walk() | 遍歷目錄樹(shù) |
| sep | 當(dāng)前操作系統(tǒng)所使用的路徑分隔符 |
147.os.path模塊_常用方法
os.path 模塊提供了目錄相關(guān)(路徑判斷、路徑切分、路徑連接、文件夾遍歷)的操作、
| 方法 | 描述 |
| isabs(path) | 判斷 path 是否絕對(duì)路徑 |
| isdir(path) | 判斷 path 是否為目錄 |
| isfile(path) | 判斷 path 是否為文件 |
| exists(path) | 判斷指定路徑的文件是否存在 |
| getsize(filename) | 返回文件的大小 |
| abspath(path) | 返回絕對(duì)路徑 |
| dirname(path) | 返回目錄的路徑 |
| getatime(filename) | 返回文件的最后訪問(wèn)時(shí)間 |
| getmtime(filename) | 返回文件的最后修改時(shí)間 |
| walk(top,func,arg) | 遞歸方式遍歷目錄 |
| join(path,*paths) | 連接多個(gè) path |
| split(path) | 對(duì)路徑進(jìn)行分割,以列表形式返回 |
| splitext(path) | 從路徑中分割文件的擴(kuò)展名 |
148.os模塊_使用walk遍歷
os.walk()方法:
返回一個(gè) 3 個(gè)元素的元組,(dirpath, dirnames, filenames),
dirpath:要列出指定目錄的路徑
dirnames:目錄下的所有文件夾
filenames:目錄下的所有文件
import os path = os.getcwd() list_files = os.walk(path) for dirpath,dirnames,filenames in list_files:for dir in dirnames:print(dir)for name in filenames:print(name)149.shutil模塊_文件和目錄拷貝
shutil 模塊是 python 標(biāo)準(zhǔn)庫(kù)中提供的,主要用來(lái)做文件和文件夾的拷貝、移動(dòng)、刪除等;還可以做文件和文件夾的壓縮、解壓縮操作。
os?模塊提供了對(duì)目錄或文件的一般操作。shutil?模塊作為補(bǔ)充,提供了移動(dòng)、復(fù)制、壓縮、解壓等操作,這些 os?模塊都沒(méi)有提供。
import shutil shutil.copyfile("1.py","1_copt.txt") shutil.copytree("movie/港臺(tái)","電影")150.shutil和zipfile模塊_壓縮和解壓縮
import shutil import zipfile shutil.make_archive("電影/gg","zip","movie/港臺(tái)") z1=zipfile.ZipFile("a.zip,"w") z1.write("1.txt") z1.close()z2=zipfile.ZipFile("a.zip","r") z2.extractall("電影") z2.close()151.遞歸算法原理_階乘計(jì)算
遞歸是一種常見(jiàn)的解決問(wèn)題的方法,即把問(wèn)題逐漸簡(jiǎn)單化。遞歸的基本思想就是“自己調(diào)用自己”,一個(gè)使用遞歸技術(shù)的方法將會(huì)直接或者間接的調(diào)用自己。利用遞歸可以用簡(jiǎn)單的程序來(lái)解決一些復(fù)雜的問(wèn)題。比如:斐波那契數(shù)列的計(jì)算、漢諾塔、快排等問(wèn)題。
遞歸結(jié)構(gòu)包括兩個(gè)部分:
1.定義遞歸頭。解答:什么時(shí)候不調(diào)用自身方法。如果沒(méi)有頭,將陷入死循環(huán),也就是遞歸的結(jié)束條件。
???????2.遞歸體。解答:什么時(shí)候需要調(diào)用自身方法。
num=1 def a1():global num #在函數(shù)內(nèi)部改變?nèi)肿兞康闹?#xff0c;要事先聲明一下num+=1print("a1")if num<3:a1() a1() def factorial(n):if n==1:return 1else:return n*factorial(n-1) a = factorial(10) print(a)152.遞歸算法原理_目錄樹(shù)結(jié)構(gòu)展示
import os allfile=[] def getFiles(path,level):childFiles = os.listdir(path)for file in childFiles:filepath = os.path.join(path, file)if os.path.isdir(filepath):getFiles(filepath, level + 1)allfile.append("\t" * level + filepath)getFiles(os.getcwd(), 0)for f in reversed(allfile):print(f) 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Python基础知识(第十天)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python基础知识(第九天)
- 下一篇: Python基础知识(第十一天)