一.文件操作
文件是指存儲在外部介質上數據的集合,文本文件編碼方式包括ASCII格式、Unicode碼、UTF-8碼、GBK編碼等。文件的操作流程為「打開文件-讀寫文件-關閉文件」三部曲。
1.打開文件
打開文件調用open()函數實現,其返回結果為一個文件對象,函數原型如下:
<variable> = open(<name>, <mode>)
-<name>表示打開文件名稱
-<mode>表示文件打開模式
其中mode常見參數包括:
- r: 只讀,文件指針將會放在文件的開頭
- w:只寫,如果文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除;如果該文件不存在,創建新文件
- a: 打開一個文件用於追加,如果該文件已存在,文件指針將會放在文件的結尾;如果該文件不存在,創建新文件進行寫入
- rb: 只讀二進制文件,一般用於非文本文件如圖片等
- wb: 只寫二進制文件,一般用於非文本文件如圖片等
- ab: 以二進制格式打開一個文件用於追加
- w+: 打開一個文件用於讀寫
open()函數的完整語法如下:
- open(file, mode=『r』, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
舉一個簡單的例子:
infile = open("test.txt","r")
注意:使用open()方法一定要保證關閉文件對象,即調用close()方法。
2.讀寫文件
(1) 讀文件
常用文件讀取方法包括:
- read()返回值為包含整個文本內容的一個字符串
- readline()返回值為文件內容的下一行內容的字符串
- readlines()返回值為整個文件內容的列表,列表中每項為一行字符串
示例如下:
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)
輸出結果如下圖所示:
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
(2) 寫文件
從計算機內存向文件寫入數據,方法包括:
write()把含有文本數據或二進制數據集的字符串寫入文件中
writelines()針對列表操作,接收一個字符串列表參數,並寫入文件
outfile1 = open('test.txt','a+',encoding="utf8")
str1 = 'nhellon'
str2 = 'worldn'
outfile1.write(str1)
outfile1.write(str2)
outfile1.close()
outfile2 = open('test02.txt','w',encoding="utf8")
outfile2.writelines(['hello',' ','world'])
outfile2.close()
infile = open('test.txt','r',encoding="utf8")
data = infile.read()
print(data)
針對test.txt文件完成追加寫入操作,針對test02.txt文件完成新建及寫入操作,同時調用write()和writelines()不同方法寫入數據。
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
3.關閉文件
文件讀寫結束後,一定要記住使用close()方法關閉文件。如忘記使用該關閉語句,則當程序突然崩潰時,該程序不會繼續執行寫入操作,甚至當程序正常執行完文件寫操作後,由於沒有關閉文件操作,該文件可能會沒有包含已寫入的數據。為安全起見,在使用完文件後需要關閉文件,建議讀者使用try-except-finally異常捕獲語句,並在finally子句中關閉文件。
try:
#文件操作
except :
#異常處理
finally:
file.close()
其他方法包括:
- file.flush():刷新文件內部緩衝
- file.next():返迴文件下一行
- file.seek(offset[, whence]):設置文件當前位置
- file.tell():返迴文件當前位置
- file.truncate([size]):截取文件,截取的位元組通過size指定
4.循環遍歷文件
在數據爬取或數據分析中,常常會涉及到文件遍歷,通常採用for循環遍歷文件內容,一方面可以調用read()函數讀取文件循環輸出,另一方面也可以調用readlines()函數實現。其兩種方法的對比代碼如下所示:
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())
輸出結果《靜夜思》如下圖所示,包含TXT文件和輸出值。
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
二.CSV文件操作
我們在使用Python進行網絡爬蟲或數據分析時,通常會遇到CSV文件,類似於Excel表格。接着我們補充SCV文件讀寫的基礎知識。
CSV(Comma-Separated Values)是常用的存儲文件,逗號分隔符,值與值之間用分號分隔。Python中導入CSV擴展包即可使用,包括寫入文件和讀取文件。
1.CSV文件寫
基本流程如下:
- 導入CSV模塊
- 創建一個CSV文件對象
- 寫入CSV文件
- 關閉文件
# -*- coding: utf-8 -*-
import csv
c = open("test-01.csv", "w", encoding="utf8") #寫文件
writer = csv.writer(c)
writer.writerow(['序號','姓名','年齡'])
tlist = []
tlist.append("1")
tlist.append("小明")
tlist.append("10")
writer.writerow(tlist)
print(tlist,type(tlist))
del tlist[:] #清空
tlist.append("2")
tlist.append("小紅")
tlist.append("9")
writer.writerow(tlist)
print(tlist,type(tlist))
c.close()
輸出結果如下圖所示:
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
注意,此時會出現多餘空行,我們需要進行簡單的處理,加入參數「newline=『』」解決。
- c = open(「test-01.csv」, 「w」, encoding=「utf8」, newline=』』)
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
2.CSV文件讀
基本流程如下:
- 導入CSV模塊
- 創建一個CSV文件對象
- 讀取CSV文件
- 關閉文件
# -*- coding: utf-8 -*-
import csv
c = open("test-01.csv", "r", encoding="utf8") #讀文件
reader = csv.reader(c)
for line in reader:
print(line[0],line[1],line[2])
c.close()
輸出結果如下圖所示:
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
在文件操作中編碼問題是最讓人頭疼的,尤其Python2的時候。但只需要環境編碼一致,注意相關轉換也能有效解決,而Python3文件讀寫操作寫清楚encoding編碼方式就能正常顯示。如果是數據庫、網頁、後台語言,三者編碼方式需要一致,比如utf8或gbk等,具體問題具體解決吧!後續作者會結合爬蟲講解CSV文件的操作。
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
三.面向對象基礎
傳統的編程方式是面向過程的,根據業務邏輯從上到下執行,而面向對象編程是另一種編程方式,此種編程方式需要使用「類」和「對象」來實現,將函數進行封裝,更接近真實生活的一種編程方式。
面向對象是將客觀事物看做屬性和行為的對象,通過抽象同一類對象的共同屬性和行為,形成類,通過對類的繼承和多態實現代碼重用等。對象(Object)是類(Class)的一個實例,如果將對象比作房子,那麼類就是房子的設計圖,並在類中定義了屬性和方法。
面向對象的三個基本特徵為:
- 封裝:把客觀事物封裝成抽象的類,類中數據和方法讓類或對象進行操作。
- 繼承:子類繼承父類後,它可以使用父類的所有功能,無需重新編寫原有類,並且可以對功能進行擴展。
- 多態:類中定義的屬性或行為,被特殊類繼承後,可以具有不同的數據類型或表現不同的行為,各個類能表現不同的語義,實現的兩種方法為覆蓋和重載。
在Python中,類就是一個模板,模板里可以包含多個函數,函數里實現一些功能;對象則是根據模板創建的實例,通過實例對象可以執行類中的函數。如下:
#創建類
class 類名:
#創建類中的函數,self特殊參數,不能省略
def 函數名(self):
#函數實現
#根據類創建對象obj
obj = 類名()
假設需要編寫一個計算長方形面積和周長的程序,其思想是定義兩個變量長和寬,然後再在類中定義計算面積和周長的方法,實例化使用。代碼如下:
#-*- 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.width
return area
def showCir(self):
cir = (self.length + self.width) * 2
return cir
#實例化
rect1 = Rect(4,5)
#調用函數
rect1.detail()
area = rect1.showArea()
cir = rect1.showCir()
print('面積:', area)
print('周長:', cir)
輸出結果面積為20,周長為18。對於面向對象的封裝來說,其實就是使用構造方法將內容封裝到對象中,然後通過對象直接或者self間接獲取被封裝的內容。
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
整體而言,面向對象是站在事物本身的角度去思考解決問題,如果上面採用面向過程定義函數的形式實現,當出現多個形狀時,你需要對每一種形狀都定義一種方法,而面向對象只需把這些形狀的屬性和方法抽象出來,形成各種形狀,更符合真實情況。
注意:為了更簡明快速的讓讀者學習Python數據爬取、數據分析、圖像識別等知識,本系列中的代碼很少採用定義類和對象的方式呈現,而是直接根據需要實現的功能或案例,直接編寫對應的代碼或函數實現。這是不規範和不合理的,在實際開發或更加規範的代碼中,更推薦大家採用面向對象的方法去編程,但本系列更想通過最簡潔的代碼告訴你原理,然後你再去提升和鍛煉自己的能力。
設計模式中的面向對象
再舉個例子:為了方便兒童學習編程,X公司開發了一套Racing Car模擬器,使用這個模擬器每個孩子都可以用一種簡單的語言來控制一輛賽車,例如right、left等。請設計一種簡單的語言,給出它的語法以及該語言的類圖。
這就是我們實際編程中聯繫到生活的問題,它涉及到了設計模式相關知識,其中我採用的方法是「命名模式」實現的,客戶端是定義Children和Car,請求者是Children發出的Right、Left、Up、Down命令,接受者是Car執行Move(),抽象命令是上下左右的抽象接口,具體命令是Car的上下左右。我製作的類圖如下:
![[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象](https://static.506064.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
在這個例子中,我們使用了面向對象的思想,站在事物本身的角度去思考解決問題,而不是面向過程定義函數的形式實現。如果又出現一個空陸兩地車,它不僅能上下左右移動,還能飛行,傳統的方法還需要再寫四個上下左右移動的方法,而面向對象直接繼承Car,補充一個飛行新方法即可(不含方向),這就是面向對象的好處。
同樣,通過這個例子我不是想證明所採用的命令模式或畫的類圖是否正確,我想闡述的是我們學習面向對象知識主要是用來解決實際生活中的問題,讓它更加高效地解決問題和優化代碼。同時,面向對象思想要適應需求的變化,解決用戶的實際需求,在設計時就要盡量考慮到變化,會涉及到抽象、封裝變化(重點)、設計模式等知識。
四.總結
無論如何,作者都希望這篇文章能給您普及一些Python知識,更希望您能跟着我一起寫代碼,一起進步。如果文章能給您的研究或項目提供一些微不足道的思路和幫助,就更欣慰了。作者最大的期望就是文章中的一些故事、話語、代碼或案例對您有所幫助,致那些努力奮鬥的人。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/227071.html