文章插圖

文章插圖
一.文件操作
文件是指存儲在外部介質上數據的集合 , 文本文件編碼方式包括ASCII格式、Unicode碼、UTF-8碼、GBK編碼等 。文件的操作流程為“打開文件-讀寫文件-關閉文件”三部曲 。
1.打開文件
打開文件調用open()函數實現 , 其返回結果為一個文件對象 , 函數原型如下:
<variable> = open(<name>, <mode>)-<name>表示打開文件名稱-<mode>表示文件打開模式其中mode常見參數包括:r: 只讀 , 文件指針將會放在文件的開頭w:只寫 , 如果文件已存在則打開文件 , 并從開頭開始編輯 , 即原有內容會被刪除;如果該文件不存在 , 創建新文件a: 打開一個文件用于追加 , 如果該文件已存在 , 文件指針將會放在文件的結尾;如果該文件不存在 , 創建新文件進行寫入rb: 只讀二進制文件 , 一般用于非文本文件如圖片等wb: 只寫二進制文件 , 一般用于非文本文件如圖片等ab: 以二進制格式打開一個文件用于追加w+: 打開一個文件用于讀寫
open()函數的完整語法如下:
【手機上csv文件用什么打開 csv文件用手機怎么打開】open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
infile = open("test.txt","r")注意:使用open()方法一定要保證關閉文件對象 , 即調用close()方法 。2.讀寫文件
(1) 讀文件
常用文件讀取方法包括:
read()返回值為包含整個文本內容的一個字符串readline()返回值為文件內容的下一行內容的字符串readlines()返回值為整個文件內容的列表 , 列表中每項為一行字符串
示例如下:
infile = open("test.txt","r",encoding="utf8")data = http://www.mnbkw.com/jxjc/168315/infile.read()print(data)print("")infile = open("test.txt","r",encoding="utf8")list_data = http://www.mnbkw.com/jxjc/168315/infile.readlines()print(list_data)輸出結果如下圖所示:從計算機內存向文件寫入數據 , 方法包括:
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 = http://www.mnbkw.com/jxjc/168315/infile.read()print(data)針對test.txt文件完成追加寫入操作 , 針對test02.txt文件完成新建及寫入操作 , 同時調用write()和writelines()不同方法寫入數據 。文件讀寫結束后 , 一定要記住使用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文件 , 類似于Excel表格 。接著我們補充SCV文件讀寫的基礎知識 。
CSV(Comma-Separated Values)是常用的存儲文件 , 逗號分隔符 , 值與值之間用分號分隔 。Python中導入CSV擴展包即可使用 , 包括寫入文件和讀取文件 。
1.CSV文件寫
基本流程如下:
導入CSV模塊創建一個CSV文件對象寫入CSV文件關閉文件
# -*- coding: utf-8 -*-import csvc = 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()輸出結果如下圖所示:c = open(“test-01.csv”, “w”, encoding=“utf8”, newline=’’)
基本流程如下:
導入CSV模塊創建一個CSV文件對象讀取CSV文件關閉文件
# -*- coding: utf-8 -*-import csvc = open("test-01.csv", "r", encoding="utf8")#讀文件reader = csv.reader(c)for line in reader:print(line[0],line[1],line[2])c.close()輸出結果如下圖所示:傳統的編程方式是面向過程的 , 根據業務邏輯從上到下執行 , 而面向對象編程是另一種編程方式 , 此種編程方式需要使用“類”和“對象”來實現 , 將函數進行封裝 , 更接近真實生活的一種編程方式 。
面向對象是將客觀事物看做屬性和行為的對象 , 通過抽象同一類對象的共同屬性和行為 , 形成類 , 通過對類的繼承和多態實現代碼重用等 。對象(Object)是類(Class)的一個實例 , 如果將對象比作房子 , 那么類就是房子的設計圖 , 并在類中定義了屬性和方法 。
面向對象的三個基本特征為:
封裝:把客觀事物封裝成抽象的類 , 類中數據和方法讓類或對象進行操作 。繼承:子類繼承父類后 , 它可以使用父類的所有功能 , 無需重新編寫原有類 , 并且可以對功能進行擴展 。多態:類中定義的屬性或行為 , 被特殊類繼承后 , 可以具有不同的數據類型或表現不同的行為 , 各個類能表現不同的語義 , 實現的兩種方法為覆蓋和重載 。
在Python中 , 類就是一個模板 , 模板里可以包含多個函數 , 函數里實現一些功能;對象則是根據模板創建的實例 , 通過實例對象可以執行類中的函數 。如下:
#創建類class 類名:#創建類中的函數,self特殊參數,不能省略def 函數名(self):#函數實現#根據類創建對象objobj = 類名()假設需要編寫一個計算長方形面積和周長的程序 , 其思想是定義兩個變量長和寬 , 然后再在類中定義計算面積和周長的方法 , 實例化使用 。代碼如下:#-*- 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#實例化rect1 = Rect(4,5)#調用函數rect1.detail()area = rect1.showArea()cir = rect1.showCir()print('面積:', area)print('周長:', cir)輸出結果面積為20 , 周長為18 。對于面向對象的封裝來說 , 其實就是使用構造方法將內容封裝到對象中 , 然后通過對象直接或者self間接獲取被封裝的內容 。注意:為了更簡明快速的讓讀者學習Python數據爬取、數據分析、圖像識別等知識 , 本系列中的代碼很少采用定義類和對象的方式呈現 , 而是直接根據需要實現的功能或案例 , 直接編寫對應的代碼或函數實現 。這是不規范和不合理的 , 在實際開發或更加規范的代碼中 , 更推薦大家采用面向對象的方法去編程 , 但本系列更想通過最簡潔的代碼告訴你原理 , 然后你再去提升和鍛煉自己的能力 。
設計模式中的面向對象
再舉個例子:為了方便兒童學習編程 , X公司開發了一套Racing Car模擬器 , 使用這個模擬器每個孩子都可以用一種簡單的語言來控制一輛賽車 , 例如right、left等 。請設計一種簡單的語言 , 給出它的語法以及該語言的類圖 。
這就是我們實際編程中聯系到生活的問題 , 它涉及到了設計模式相關知識 , 其中我采用的方法是“命名模式”實現的 , 客戶端是定義Children和Car , 請求者是Children發出的Right、Left、Up、Down命令 , 接受者是Car執行Move() , 抽象命令是上下左右的抽象接口 , 具體命令是Car的上下左右 。我制作的類圖如下:
同樣 , 通過這個例子我不是想證明所采用的命令模式或畫的類圖是否正確 , 我想闡述的是我們學習面向對象知識主要是用來解決實際生活中的問題 , 讓它更加高效地解決問題和優化代碼 。同時 , 面向對象思想要適應需求的變化 , 解決用戶的實際需求 , 在設計時就要盡量考慮到變化 , 會涉及到抽象、封裝變化(重點)、設計模式等知識 。
四.總結
無論如何 , 作者都希望這篇文章能給您普及一些Python知識 , 更希望您能跟著我一起寫代碼 , 一起進步 。如果文章能給您的研究或項目提供一些微不足道的思路和幫助 , 就更欣慰了 。作者最大的期望就是文章中的一些故事、話語、代碼或案例對您有所幫助 , 致那些努力奮斗的人 。
- 手機拍照排行榜2022 手機拍照排行榜dxo
- 太可怕了 玩手機竟然玩出這個
- 手部常做這3個動作能防病養生
- 藍牙應用程序下載安裝 安裝手機藍牙系統
- 華為6寸以下手機推薦 6寸以下手機推薦2021
- 最實用的智能手機 智能手機什么好用
- 榮耀10手機多少錢? 榮耀10手機多少錢6+128
- 榮耀30手機上市時間 榮耀30是幾月份上市的
- 撩女票的暖心套路一問一答,感情升溫好幫手
- 大屏幕智能手機推薦 推薦一款大屏智能手機
