【Python基础知识-pycharm版】第十一节-文件操作(IO技术)
第十一節(jié)-文件操作(IO技術(shù))
- 文本文件和二進(jìn)制文件
- 文件操作相關(guān)模塊概述
- 創(chuàng)建文件對(duì)象 open()
- 文本文件的寫入
- 基本的文件寫入操作
- 常用編碼介紹
- ASCII
- ISO8859-1
- GB2312,GBK,GB18030
- 中文亂碼問(wèn)題
- write()/writelines()寫入數(shù)據(jù)
- close()關(guān)閉文件流
- with 語(yǔ)句(上下文管理器)
- 文本文件的讀取
- 二進(jìn)制文件的讀取和寫入
- 文件對(duì)象的常用屬性和方法
- 文件任意位置操作
- 使用 pickle 序列化
- CSV 文件的操作
- csv.reader 對(duì)象和 csv 文件讀取
- csv.writer 對(duì)象和 csv 文件寫入
- os 和 os.path 模塊
- os 模塊-調(diào)用操作系統(tǒng)命令
- os 模塊-文件和目錄操作
- os.path 模塊
- 【示例】列出指定目錄下所有的.py 文件,并輸出文件名
- walk()遞歸遍歷所有文件和目錄
- shutil 模塊(拷貝和壓縮)
- 遞歸
文本文件和二進(jìn)制文件
按文件中數(shù)據(jù)組織形式,我們把文件分為文本文件和二進(jìn)制文件兩大類。
文本文件存儲(chǔ)的是普通“字符”文本,python 默認(rèn)為 unicode 字符集(兩個(gè)字節(jié)表示一個(gè)字符,最多可以表示:65536 個(gè)),可以使用記事本程序打開(kāi)。但是,像 word 軟件編輯的文檔不是文本文件。
二進(jìn)制文件把數(shù)據(jù)內(nèi)容用“字節(jié)”進(jìn)行存儲(chǔ),無(wú)法用記事本打開(kāi)。必須使用專用的軟件解碼。常見(jiàn)的有:MP4 視頻文件、MP3 音頻文件、JPG 圖片、doc 文檔等等。
文件操作相關(guān)模塊概述
創(chuàng)建文件對(duì)象 open()
open()函數(shù)用于創(chuàng)建文件對(duì)象,基本語(yǔ)法格式如下:
open(文件名[,打開(kāi)方式])
如果只是文件名,代表在當(dāng)前目錄下的文件。文件名可以錄入全路徑,比如:D:\a\b.txt。
為了減少“\”的輸入,可以使用原始字符串:r“d:\b.txt”。示例如下:
文本文件對(duì)象和二進(jìn)制文件對(duì)象的創(chuàng)建:
如果我們沒(méi)有增加模式“b”,則默認(rèn)創(chuàng)建的是文本文件對(duì)象,處理的基本單元是“字
符”。如果是二進(jìn)制模式“b”,則創(chuàng)建的是二進(jìn)制文件對(duì)象,處理的基本單元是“字節(jié)”。
文本文件的寫入
基本的文件寫入操作
文本文件的寫入一般就是三個(gè)步驟:
我們首先創(chuàng)建一個(gè)小程序,體驗(yàn)一下文本文件的寫入操作。
【操作】文本寫入操作簡(jiǎn)單測(cè)試
常用編碼介紹
在操作文本文件時(shí),經(jīng)常會(huì)操作中文,這時(shí)候就經(jīng)常會(huì)碰到亂碼問(wèn)題。為了讓大家有能力解決中文亂碼問(wèn)題,這里簡(jiǎn)單介紹一下各種編碼之間的關(guān)系。
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è)字符。只定義了 2 7 =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,GBK,GB18030
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 仍然由于 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。
【示例】中文字符文件,亂碼出現(xiàn)測(cè)試
【示例】通過(guò)指定文件編碼解決中文亂碼問(wèn)題
write()/writelines()寫入數(shù)據(jù)
write(a):把字符串 a 寫入到文件中
writelines(b):把字符串列表寫入文件中,不添加換行符
【操作】添加字符串列表數(shù)據(jù)到文件中
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ì)象
with 語(yǔ)句(上下文管理器)
with 關(guān)鍵字(上下文管理器)可以自動(dòng)管理上下文資源,不論什么原因跳出 with 塊,都能確保文件正確的關(guān)閉,并且可以在代碼塊執(zhí)行完畢后自動(dòng)還原進(jìn)入該代碼塊時(shí)的現(xiàn)場(chǎng)。
【操作】使用 with 管理文件寫入操作
s=['高老大\n','高老二\n','高老三\n'] with open(r'd:\bb.txt','w') as f:f.writelines(s)文本文件的讀取
文件的讀取一般使用如下三個(gè)方法:
從文件中讀取 size 個(gè)字符,并作為結(jié)果返回。如果沒(méi)有 size 參數(shù),則讀取整個(gè)文件。
讀取到文件末尾,會(huì)返回空字符串。
讀取一行內(nèi)容作為結(jié)果返回。讀取到文件末尾,會(huì)返回空字符串。
文本文件中,每一行作為一個(gè)字符串存入列表中,返回該列表
【操作】 讀取一個(gè)文件前 4 個(gè)字符
【操作】文件較小,一次將文件內(nèi)容讀入到程序中
with open(r'bb','r',encoding='utf-8') as f:print(f.read())【操作】按行讀取一個(gè)文件
with open(r'bb','r') as f:while True:fragment=f.readline()if not fragment:breakelse:print(fragment,end='')【操作】使用迭代器(每次返回一行)讀取文本文件
with open(r"d:\bb.txt","r") as f:for a in f:print(a,end="") 高老大 高老二 高老三Process finished with exit code 0【操作】為文本文件每一行的末尾增加行號(hào)
with open('e.txt','r',encoding='utf-8') as f:lines=f.readlines()lines=[line.rstrip()+'#'+str(index+1)+'\n'for index,line in enumerate(lines)] #推導(dǎo)生成列表with open('e.txt','w',encoding='utf-8') as f:f.writelines(lines)二進(jìn)制文件的讀取和寫入
二進(jìn)制文件的處理流程和文本文件流程一致。首先還是要?jiǎng)?chuàng)建文件對(duì)象,不過(guò),我們需要指
定二進(jìn)制模式,從而創(chuàng)建出二進(jìn)制文件對(duì)象。例如:
創(chuàng)建好二進(jìn)制文件對(duì)象后,仍然可以使用 write()、read()實(shí)現(xiàn)文件的讀寫操作。
【操作】 讀取圖片文件,實(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('圖片拷貝完成!')文件對(duì)象的常用屬性和方法
文件對(duì)象封裝了文件相關(guān)的操作。在前面我們學(xué)習(xí)了通過(guò)文件對(duì)象對(duì)文件進(jìn)行讀寫操作。本
節(jié)我們?cè)敿?xì)列出文件對(duì)象的常用屬性和方法,并進(jìn)行說(shuō)明。
文件任意位置操作
【示例】seek()移動(dòng)文件指針示例
with open('e.txt','r',encoding='utf-8') as f:print('文件名是:{0}'.format(f.name))print(f.tell())print('讀取的內(nèi)容:{}'.format(str(f.readline())))print(f.tell())f.seek(16)print('讀取的內(nèi)容:{}'.format(str(f.readline())))使用 pickle 序列化
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ì)象
【操作】將對(duì)象序列化到文件中
import pickle with open(r'd:\data.dat','wb') as f:a1='高琪琪'a2=234a3=[20,30,40]pickle.dump(a1,f)pickle.dump(a2, f)pickle.dump(a3, f) import pickle with open(r'd:\data.dat','rb') as f:a1=pickle.load(f)a2=pickle.load(f)a3 = pickle.load(f)print(a1)print(a2)print(a3)CSV 文件的操作
csv (Comma Separated Values) 是逗號(hào)分隔符文本格式,常用于數(shù)據(jù)交換、Excel
文件和數(shù)據(jù)庫(kù)數(shù)據(jù)的導(dǎo)入和導(dǎo)出。 與 Excel 文件不同,CSV 文件中:
值沒(méi)有類型,所有值都是字符串
不能指定字體顏色等樣式
不能指定單元格的寬高,不能合并單元格
沒(méi)有多個(gè)工作表
不能嵌入圖像圖表
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
csv.reader 對(duì)象和 csv 文件讀取
【操作】csv.reader 對(duì)象于從 csv 文件讀取數(shù)據(jù)
import csv with open(r'ee.csv') as ee:ee_csv=csv.reader(ee) #創(chuàng)建csv對(duì)象,它是一個(gè)包含所有數(shù)據(jù)的列表,每一行為一個(gè)元素headers=next(ee_csv) #獲得列表對(duì)象,包含標(biāo)題行的信息print(headers)for row in ee_csv: #循環(huán)打印各行內(nèi)容print(row)csv.writer 對(duì)象和 csv 文件寫入
【操作】csv.writer 對(duì)象寫一個(gè) csv 文件
#【操作】csv.writer 對(duì)象寫一個(gè) csv 文件 import csvheaders=['工號(hào)','姓名','年齡','地址','月薪'] rows=[("1001","高淇",18,"西三旗 1 號(hào)院","50000"),("1002","高八",19,"西三旗 1 號(hào)院","30000")]with open(r'b.csv','w') as b:b_csv=csv.writer(b) #創(chuàng)建csv對(duì)象b_csv.writerow(headers) #寫入一行(標(biāo)題)b_csv.writerows(rows) 工號(hào),姓名,年齡,地址,月薪1001,高淇,18,西三旗 1 號(hào)院,500001002,高八,19,西三旗 1 號(hào)院,30000os 和 os.path 模塊
os 模塊可以幫助我們直接對(duì)操作系統(tǒng)進(jìn)行操作。我們可以直接調(diào)用操作系統(tǒng)的可執(zhí)行
文件、命令,直接操作文件、目錄等等。在系統(tǒng)運(yùn)維的核心基礎(chǔ)。
os 模塊-調(diào)用操作系統(tǒng)命令
·os.system 可以幫助我們直接調(diào)用系統(tǒng)的命令
【示例】os.system 調(diào)用 windows 系統(tǒng)的記事本程序
【示例】os.system 調(diào)用 windows 系統(tǒng)中 ping 命令
#【示例】os.system 調(diào)用 windows 系統(tǒng)中 ping 命令 import os os.system('ping www.baidu.com')
【示例】運(yùn)行安裝好的微信
os 模塊-文件和目錄操作
我們可以通過(guò)前面講的文件對(duì)象實(shí)現(xiàn)對(duì)于文件內(nèi)容的讀寫操作。如果,還需要對(duì)文件和目錄做其他操作,可以使用 os 和 os.path 模塊。
os 模塊下常用操作文件的方法
os 模塊下關(guān)于目錄操作的相關(guān)方法,匯總?cè)缦?#xff1a;
os.path 模塊
os.path 模塊提供了目錄相關(guān)(路徑判斷、路徑切分、路徑連接、文件夾遍歷)的操作
【示例】列出指定目錄下所有的.py 文件,并輸出文件名
##列出指定目錄下所有的.py 文件,并輸出文件名 import os import os.pathpath=os.getcwd() #返回當(dāng)前工作目錄 file_list=os.listdir(path) #列出子目錄和子文件for filename in file_list:pos=filename.rfind('.')if filename[pos+1:]=="py":print(filename,end='\t')print('##############')file_list2=[filename for filename in os.listdir(path) if filename.endswith('.py')] for filename in file_list2:print(filename,end='\t') my01.py my02.py __init__.py ############## my01.py my02.py __init__.py Process finished with exit code 0walk()遞歸遍歷所有文件和目錄
os.walk()方法:
返回一個(gè) 3 個(gè)元素的元組,(dirpath, dirnames, filenames),
dirpath:要列出指定目錄的路徑
dirnames:目錄下的所有文件夾
filenames:目錄下的所有文件
【示例】使用 walk()遞歸遍歷所有文件和目錄
shutil 模塊(拷貝和壓縮)
shutil 模塊是 python 標(biāo)準(zhǔn)庫(kù)中提供的,主要用來(lái)做文件和文件夾的拷貝、移動(dòng)、刪除等;還可以做
文件和文件夾的壓縮、解壓縮操作。
os 模塊提供了對(duì)目錄或文件的一般操作。shutil 模塊作為補(bǔ)充,提供了移動(dòng)、復(fù)制、壓縮、解壓等操
作,這些 os 模塊都沒(méi)有提供。
【示例】實(shí)現(xiàn)文件的拷貝
【示例】實(shí)現(xiàn)遞歸的拷貝文件夾內(nèi)容(使用 shutil 模塊)
#【示例】實(shí)現(xiàn)遞歸的拷貝文件夾內(nèi)容(使用 shutil 模塊)import shutil #'音樂(lè)'文件夾不存在才能用 shutil.copytree('movie/港臺(tái)','音樂(lè)',ignore=shutil.ignore_patterns('*.html','*.htm'))【示例】實(shí)現(xiàn)將文件夾所有內(nèi)容壓縮(使用 shutil 模塊)
#【示例】實(shí)現(xiàn)將文件夾所有內(nèi)容壓縮(使用 shutil 模塊) import shutil import zipfile# 將movie/港臺(tái)文件夾下所有內(nèi)容壓縮到音樂(lè)文件夾下生成周星馳.zip shutil.make_archive('音樂(lè)/周星馳','zip','movie/港臺(tái)')#壓縮:將指定的多個(gè)文件壓縮到一個(gè)zip文件 z=zipfile.ZipFile('a.zip','w') z.write('1.txt') z.write('2.txt') z.close()【示例】實(shí)現(xiàn)將壓縮包解壓縮到指定文件夾(使用 shutil 模塊)
#【示例】實(shí)現(xiàn)將壓縮包解壓縮到指定文件夾(使用 shutil 模塊) import shutil import zipfile #解壓縮z2=zipfile.ZipFile('a.zip','r') z2.extractall('d:/') #設(shè)置解壓的地址 z2.close()遞歸
【示例 3-22】使用遞歸求 n!
#測(cè)試遞歸 def factorial(n):if n==1:return 1else:return n*factorial(n-1)a=factorial(8) print(a)【示例】使用遞歸算法遍歷目錄下所有文件
#遞歸打印所有的目錄和文件 import osallfiles=[]def getAllFiles(path,level):childFiles=os.listdir(path)for file in childFiles:filepath=os.path.join(path,file)if os.path.isdir(filepath):getAllFiles(filepath,level+1)allfiles.append('\t'*level+filepath)getAllFiles('movie',0)for f in reversed(allfiles):print(f)總結(jié)
以上是生活随笔為你收集整理的【Python基础知识-pycharm版】第十一节-文件操作(IO技术)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php.ini开启命名空间,Zend F
- 下一篇: python读取html文件正则替换_P