[Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
歡迎大家來到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學(xué)習(xí)和玩耍,看看Python這個(gè)有趣的世界。所有文章都將結(jié)合案例、代碼和作者的經(jīng)驗(yàn)講解,真心想把自己近十年的編程經(jīng)驗(yàn)分享給大家,希望對(duì)您有所幫助,文章中不足之處也請(qǐng)海涵。
Python系列整體框架包括基礎(chǔ)語法10篇、網(wǎng)絡(luò)爬蟲30篇、可視化分析10篇、機(jī)器學(xué)習(xí)20篇、大數(shù)據(jù)分析20篇、圖像識(shí)別30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的關(guān)注、點(diǎn)贊和轉(zhuǎn)發(fā)就是對(duì)秀璋最大的支持,知識(shí)無價(jià)人有情,希望我們都能在人生路上開心快樂、共同成長(zhǎng)。
本文參考了作者CSDN的文章,鏈接如下:
- https://blog.csdn.net/Eastmount
- https://github.com/eastmountyxz/Python-zero2one
同時(shí),作者新開的“娜璋AI安全之家”將專注于Python和安全技術(shù),主要分享Web滲透、系統(tǒng)安全、人工智能、大數(shù)據(jù)分析、圖像識(shí)別、惡意代碼檢測(cè)、CVE復(fù)現(xiàn)、威脅情報(bào)分析等文章。雖然作者是一名技術(shù)小白,但會(huì)保證每一篇文章都會(huì)很用心地撰寫,希望這些基礎(chǔ)性文章對(duì)你有所幫助,在Python和安全路上與大家一起進(jìn)步。
文章目錄
- 一.文件操作
- 1.打開文件
- 2.讀寫文件
- 3.關(guān)閉文件
- 4.循環(huán)遍歷文件
- 二.CSV文件操作
- 1.CSV文件寫
- 2.CSV文件讀
- 三.面向?qū)ο蠡A(chǔ)
- 四.總結(jié)
一.文件操作
文件是指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,文本文件編碼方式包括ASCII格式、Unicode碼、UTF-8碼、GBK編碼等。文件的操作流程為“打開文件-讀寫文件-關(guān)閉文件”三部曲。
1.打開文件
打開文件調(diào)用open()函數(shù)實(shí)現(xiàn),其返回結(jié)果為一個(gè)文件對(duì)象,函數(shù)原型如下:
<variable> = open(<name>, <mode>)-<name>表示打開文件名稱-<mode>表示文件打開模式其中mode常見參數(shù)包括:
- r: 只讀,文件指針將會(huì)放在文件的開頭
- w:只寫,如果文件已存在則打開文件,并從開頭開始編輯,即原有內(nèi)容會(huì)被刪除;如果該文件不存在,創(chuàng)建新文件
- a: 打開一個(gè)文件用于追加,如果該文件已存在,文件指針將會(huì)放在文件的結(jié)尾;如果該文件不存在,創(chuàng)建新文件進(jìn)行寫入
- rb: 只讀二進(jìn)制文件,一般用于非文本文件如圖片等
- wb: 只寫二進(jìn)制文件,一般用于非文本文件如圖片等
- ab: 以二進(jìn)制格式打開一個(gè)文件用于追加
- w+: 打開一個(gè)文件用于讀寫
open()函數(shù)的完整語法如下:
- open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
舉一個(gè)簡(jiǎn)單的例子:
infile = open("test.txt","r")注意:使用open()方法一定要保證關(guān)閉文件對(duì)象,即調(diào)用close()方法。
2.讀寫文件
(1) 讀文件
常用文件讀取方法包括:
- read()返回值為包含整個(gè)文本內(nèi)容的一個(gè)字符串
- readline()返回值為文件內(nèi)容的下一行內(nèi)容的字符串
- readlines()返回值為整個(gè)文件內(nèi)容的列表,列表中每項(xiàng)為一行字符串
示例如下:
infile = open("test.txt","r",encoding="utf8") data = infile.read() print(data) print("")infile = open("test.txt","r",encoding="utf8") list_data = infile.readlines() print(list_data)輸出結(jié)果如下圖所示:
(2) 寫文件
從計(jì)算機(jī)內(nèi)存向文件寫入數(shù)據(jù),方法包括:
- write()把含有文本數(shù)據(jù)或二進(jìn)制數(shù)據(jù)集的字符串寫入文件中
- writelines()針對(duì)列表操作,接收一個(gè)字符串列表參數(shù),并寫入文件
針對(duì)test.txt文件完成追加寫入操作,針對(duì)test02.txt文件完成新建及寫入操作,同時(shí)調(diào)用write()和writelines()不同方法寫入數(shù)據(jù)。
3.關(guān)閉文件
文件讀寫結(jié)束后,一定要記住使用close()方法關(guān)閉文件。如忘記使用該關(guān)閉語句,則當(dāng)程序突然崩潰時(shí),該程序不會(huì)繼續(xù)執(zhí)行寫入操作,甚至當(dāng)程序正常執(zhí)行完文件寫操作后,由于沒有關(guān)閉文件操作,該文件可能會(huì)沒有包含已寫入的數(shù)據(jù)。為安全起見,在使用完文件后需要關(guān)閉文件,建議讀者使用try-except-finally異常捕獲語句,并在finally子句中關(guān)閉文件。
try:#文件操作 except :#異常處理 finally:file.close()其他方法包括:
- file.flush():刷新文件內(nèi)部緩沖
- file.next():返回文件下一行
- file.seek(offset[, whence]):設(shè)置文件當(dāng)前位置
- file.tell():返回文件當(dāng)前位置
- file.truncate([size]):截取文件,截取的字節(jié)通過size指定
4.循環(huán)遍歷文件
在數(shù)據(jù)爬取或數(shù)據(jù)分析中,常常會(huì)涉及到文件遍歷,通常采用for循環(huán)遍歷文件內(nèi)容,一方面可以調(diào)用read()函數(shù)讀取文件循環(huán)輸出,另一方面也可以調(diào)用readlines()函數(shù)實(shí)現(xiàn)。其兩種方法的對(duì)比代碼如下所示:
infile = open('test02.txt', 'r', encoding="utf8") for line in infile.readlines():print(line) print(infile.close())infile = open('test02.txt', 'r', encoding="utf8").read() for line in infile:print(line) print(infile.close())輸出結(jié)果《靜夜思》如下圖所示,包含TXT文件和輸出值。
二.CSV文件操作
我們?cè)谑褂肞ython進(jìn)行網(wǎng)絡(luò)爬蟲或數(shù)據(jù)分析時(shí),通常會(huì)遇到CSV文件,類似于Excel表格。接著我們補(bǔ)充SCV文件讀寫的基礎(chǔ)知識(shí)。
CSV(Comma-Separated Values)是常用的存儲(chǔ)文件,逗號(hào)分隔符,值與值之間用分號(hào)分隔。Python中導(dǎo)入CSV擴(kuò)展包即可使用,包括寫入文件和讀取文件。
1.CSV文件寫
基本流程如下:
- 導(dǎo)入CSV模塊
- 創(chuàng)建一個(gè)CSV文件對(duì)象
- 寫入CSV文件
- 關(guān)閉文件
輸出結(jié)果如下圖所示:
注意,此時(shí)會(huì)出現(xiàn)多余空行,我們需要進(jìn)行簡(jiǎn)單的處理,加入?yún)?shù)“newline=‘’”解決。
- c = open(“test-01.csv”, “w”, encoding=“utf8”, newline=’’)
2.CSV文件讀
基本流程如下:
- 導(dǎo)入CSV模塊
- 創(chuàng)建一個(gè)CSV文件對(duì)象
- 讀取CSV文件
- 關(guān)閉文件
輸出結(jié)果如下圖所示:
在文件操作中編碼問題是最讓人頭疼的,尤其Python2的時(shí)候。但只需要環(huán)境編碼一致,注意相關(guān)轉(zhuǎn)換也能有效解決,而Python3文件讀寫操作寫清楚encoding編碼方式就能正常顯示。如果是數(shù)據(jù)庫、網(wǎng)頁、后臺(tái)語言,三者編碼方式需要一致,比如utf8或gbk等,具體問題具體解決吧!后續(xù)作者會(huì)結(jié)合爬蟲講解CSV文件的操作。
三.面向?qū)ο蠡A(chǔ)
傳統(tǒng)的編程方式是面向過程的,根據(jù)業(yè)務(wù)邏輯從上到下執(zhí)行,而面向?qū)ο缶幊淌橇硪环N編程方式,此種編程方式需要使用“類”和“對(duì)象”來實(shí)現(xiàn),將函數(shù)進(jìn)行封裝,更接近真實(shí)生活的一種編程方式。
面向?qū)ο笫菍⒖陀^事物看做屬性和行為的對(duì)象,通過抽象同一類對(duì)象的共同屬性和行為,形成類,通過對(duì)類的繼承和多態(tài)實(shí)現(xiàn)代碼重用等。對(duì)象(Object)是類(Class)的一個(gè)實(shí)例,如果將對(duì)象比作房子,那么類就是房子的設(shè)計(jì)圖,并在類中定義了屬性和方法。
面向?qū)ο蟮娜齻€(gè)基本特征為:
- 封裝:把客觀事物封裝成抽象的類,類中數(shù)據(jù)和方法讓類或?qū)ο筮M(jìn)行操作。
- 繼承:子類繼承父類后,它可以使用父類的所有功能,無需重新編寫原有類,并且可以對(duì)功能進(jìn)行擴(kuò)展。
- 多態(tài):類中定義的屬性或行為,被特殊類繼承后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)不同的行為,各個(gè)類能表現(xiàn)不同的語義,實(shí)現(xiàn)的兩種方法為覆蓋和重載。
在Python中,類就是一個(gè)模板,模板里可以包含多個(gè)函數(shù),函數(shù)里實(shí)現(xiàn)一些功能;對(duì)象則是根據(jù)模板創(chuàng)建的實(shí)例,通過實(shí)例對(duì)象可以執(zhí)行類中的函數(shù)。如下:
#創(chuàng)建類 class 類名:#創(chuàng)建類中的函數(shù),self特殊參數(shù),不能省略def 函數(shù)名(self):#函數(shù)實(shí)現(xiàn)#根據(jù)類創(chuàng)建對(duì)象obj obj = 類名()假設(shè)需要編寫一個(gè)計(jì)算長(zhǎng)方形面積和周長(zhǎng)的程序,其思想是定義兩個(gè)變量長(zhǎng)和寬,然后再在類中定義計(jì)算面積和周長(zhǎng)的方法,實(shí)例化使用。代碼如下:
#-*- coding:utf-8 -*- class Rect:def __init__(self, length, width):self.length = length;self.width = width;def detail(self):print(self.length, self.width)def showArea(self):area = self.length * self.widthreturn areadef showCir(self):cir = (self.length + self.width) * 2return cir #實(shí)例化 rect1 = Rect(4,5) #調(diào)用函數(shù) rect1.detail() area = rect1.showArea() cir = rect1.showCir() print('面積:', area) print('周長(zhǎng):', cir)輸出結(jié)果面積為20,周長(zhǎng)為18。對(duì)于面向?qū)ο蟮姆庋b來說,其實(shí)就是使用構(gòu)造方法將內(nèi)容封裝到對(duì)象中,然后通過對(duì)象直接或者self間接獲取被封裝的內(nèi)容。
整體而言,面向?qū)ο笫钦驹谑挛锉旧淼慕嵌热ニ伎冀鉀Q問題,如果上面采用面向過程定義函數(shù)的形式實(shí)現(xiàn),當(dāng)出現(xiàn)多個(gè)形狀時(shí),你需要對(duì)每一種形狀都定義一種方法,而面向?qū)ο笾恍璋堰@些形狀的屬性和方法抽象出來,形成各種形狀,更符合真實(shí)情況。
注意:為了更簡(jiǎn)明快速的讓讀者學(xué)習(xí)Python數(shù)據(jù)爬取、數(shù)據(jù)分析、圖像識(shí)別等知識(shí),本系列中的代碼很少采用定義類和對(duì)象的方式呈現(xiàn),而是直接根據(jù)需要實(shí)現(xiàn)的功能或案例,直接編寫對(duì)應(yīng)的代碼或函數(shù)實(shí)現(xiàn)。這是不規(guī)范和不合理的,在實(shí)際開發(fā)或更加規(guī)范的代碼中,更推薦大家采用面向?qū)ο蟮姆椒ㄈゾ幊?#xff0c;但本系列更想通過最簡(jiǎn)潔的代碼告訴你原理,然后你再去提升和鍛煉自己的能力。
設(shè)計(jì)模式中的面向?qū)ο?/strong>
再舉個(gè)例子:為了方便兒童學(xué)習(xí)編程,X公司開發(fā)了一套R(shí)acing Car模擬器,使用這個(gè)模擬器每個(gè)孩子都可以用一種簡(jiǎn)單的語言來控制一輛賽車,例如right、left等。請(qǐng)?jiān)O(shè)計(jì)一種簡(jiǎn)單的語言,給出它的語法以及該語言的類圖。
這就是我們實(shí)際編程中聯(lián)系到生活的問題,它涉及到了設(shè)計(jì)模式相關(guān)知識(shí),其中我采用的方法是“命名模式”實(shí)現(xiàn)的,客戶端是定義Children和Car,請(qǐng)求者是Children發(fā)出的Right、Left、Up、Down命令,接受者是Car執(zhí)行Move(),抽象命令是上下左右的抽象接口,具體命令是Car的上下左右。我制作的類圖如下:
在這個(gè)例子中,我們使用了面向?qū)ο蟮乃枷?#xff0c;站在事物本身的角度去思考解決問題,而不是面向過程定義函數(shù)的形式實(shí)現(xiàn)。如果又出現(xiàn)一個(gè)空陸兩地車,它不僅能上下左右移動(dòng),還能飛行,傳統(tǒng)的方法還需要再寫四個(gè)上下左右移動(dòng)的方法,而面向?qū)ο笾苯永^承Car,補(bǔ)充一個(gè)飛行新方法即可(不含方向),這就是面向?qū)ο蟮暮锰帯?br />
同樣,通過這個(gè)例子我不是想證明所采用的命令模式或畫的類圖是否正確,我想闡述的是我們學(xué)習(xí)面向?qū)ο笾R(shí)主要是用來解決實(shí)際生活中的問題,讓它更加高效地解決問題和優(yōu)化代碼。同時(shí),面向?qū)ο笏枷胍m應(yīng)需求的變化,解決用戶的實(shí)際需求,在設(shè)計(jì)時(shí)就要盡量考慮到變化,會(huì)涉及到抽象、封裝變化(重點(diǎn))、設(shè)計(jì)模式等知識(shí)。
四.總結(jié)
無論如何,作者都希望這篇文章能給您普及一些Python知識(shí),更希望您能跟著我一起寫代碼,一起進(jìn)步。如果文章能給您的研究或項(xiàng)目提供一些微不足道的思路和幫助,就更欣慰了。作者最大的期望就是文章中的一些故事、話語、代碼或案例對(duì)您有所幫助,致那些努力奮斗的人。
前文賞析:
- [Python從零到壹] 一.為什么我們要學(xué)Python及基礎(chǔ)語法詳解
- [Python從零到壹] 二.語法基礎(chǔ)之條件語句、循環(huán)語句和函數(shù)
- [Python從零到壹] 三.語法基礎(chǔ)之文件操作、CSV文件讀寫及面向?qū)ο?/li>
最后,真誠地感謝您關(guān)注“娜璋之家”公眾號(hào),感謝CSDN這么多年的陪伴,會(huì)一直堅(jiān)持分享,希望我的文章能陪伴你成長(zhǎng),也希望在技術(shù)路上不斷前行。文章如果對(duì)你有幫助、有感悟,就是對(duì)我最好的回報(bào),且看且珍惜!2020年8月18日建立的公眾號(hào),再次感謝您的關(guān)注,也請(qǐng)幫忙宣傳下“娜璋之家”,哈哈~初來乍到,還請(qǐng)多多指教。
遺憾,讓我們懂得完美。
逝去,讓我們不斷前行。
她夜色中的身姿是那么的美。
(By:娜璋之家 Eastmount 2020-09-22 夜于武漢 https://blog.csdn.net/Eastmount )
參考文獻(xiàn)如下:
- 作者書籍《Python網(wǎng)絡(luò)數(shù)據(jù)爬取及分析從入門到精通》
- 作者博客:https://blog.csdn.net/Eastmount
- https://www.runoob.com/python/file-methods.html
- https://www.cnblogs.com/qican/p/11122206.html
- https://blog.csdn.net/Eastmount/article/details/78389201
總結(jié)
以上是生活随笔為你收集整理的[Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [网络安全自学篇] 九十五.利用XAMP
- 下一篇: [译] APT分析报告:03.OpBlu