Python升级之路( Lv9 ) 文件操作
Python系列文章目錄
第一章 Python 入門
第二章 Python基本概念
第三章 序列
第四章 控制語(yǔ)句
第五章 函數(shù)
第六章 面向?qū)ο蠡A(chǔ)
第七章 面向?qū)ο笊钊?br /> 第八章 異常機(jī)制
第九章 文件操作
文件操作
- Python系列文章目錄
- 前言
- 一、什么是文件操作
- 1. 文件分類
- 2. 常用編碼
- ASCII
- GBK
- Unicode
- UTF-8
- 二、文件操作
- 1. 創(chuàng)建文件對(duì)象
- 2. 文件的寫入
- 基本文件的寫入操作
- 中文亂碼
- 代碼編寫時(shí)
- 控制臺(tái)輸出時(shí)
- write()/writelines()寫入數(shù)據(jù)
- close()關(guān)閉文件流
- with語(yǔ)句(上下文管理器)
- 3. 文件的讀取
- 二進(jìn)制文件的讀取和寫入
- 4. 文件對(duì)象的常用屬性和方法
- 文件任意位置操作
- 三、文件操作拓展模塊
- 1. pickle序列化模塊
- 2. csv文件的操作
- csv文件讀取
- csv文件寫入
- 3. os和os.path模塊
- os模塊-調(diào)用操作系統(tǒng)命令
- os模塊-文件和目錄操作
- os.path模塊
- walk()遞歸遍歷所有文件和目錄
- 遞歸遍歷目錄下所有文件
- 4. shutil模塊(拷貝和壓縮)
前言
在本章節(jié), 主要介紹了文件操作相關(guān)的API方法使用
首先我們將會(huì)學(xué)習(xí)什么是文件操作, 以及文件分類還有在IO操作時(shí)會(huì)用到的常用編碼介紹
然后我們學(xué)習(xí)了文件操作的流程, 創(chuàng)建->寫入->關(guān)閉
在然后我們學(xué)習(xí)了文件的拓展, 序列化模塊pickle, 文件操作模塊csv, 系統(tǒng)操作調(diào)用模塊os和os.path以及文件拷貝壓縮模塊shutil
一、什么是文件操作
一個(gè)完整的程序一般都包括數(shù)據(jù)的存儲(chǔ)和讀取;我們?cè)谇懊鎸懙某绦驍?shù)據(jù)都沒(méi)有進(jìn)行實(shí)際的存儲(chǔ),因此python解釋器執(zhí)行完數(shù)據(jù)就消失了
實(shí)際開(kāi)發(fā)中,我們經(jīng)常需要從外部存儲(chǔ)介質(zhì)(硬盤、光盤、U盤等)讀取數(shù)據(jù),或者將程序產(chǎn)生的數(shù)據(jù)存儲(chǔ)到文件中,實(shí)現(xiàn)“持久化”保存
1. 文件分類
按文件中數(shù)據(jù)組織形式,我們把文件分為文本文件和二進(jìn)制文件兩大類:
文本文件
文本文件存儲(chǔ)的是普通“字符”文本,python默認(rèn)為 unicode 字符集,可以使用記事本程序打開(kāi)
二進(jìn)制文件
二進(jìn)制文件把數(shù)據(jù)內(nèi)容用“字節(jié)”進(jìn)行存儲(chǔ),無(wú)法用記事本打開(kāi), 必須使用專用的軟件解碼.
常見(jiàn)的有:MP4視頻文件、MP3音頻文件、JPG圖片、doc文檔等等
2. 常用編碼
在操作文本文件時(shí),經(jīng)常會(huì)操作中文,這時(shí)候就經(jīng)常會(huì)碰到亂碼問(wèn)題.
為了解決中文亂碼問(wèn)題,需要學(xué)習(xí)下各個(gè)編碼之前的問(wèn)題.
常用編碼之間的關(guān)系如下:
ASCII
全稱為 American Standard Code for Information Interchange ,美國(guó)信息交換標(biāo)準(zhǔn)代碼,
這是世界上最早最通用的單字節(jié)編碼系統(tǒng),主要用來(lái)顯示現(xiàn)代英語(yǔ)及其他西歐語(yǔ)言
注意事項(xiàng):
- ASCII 碼用7位表示,只能表示128個(gè)字符. 只定義了2^7=128個(gè)字符,用7bit即可完全編碼,
而一字節(jié)8bit的容量是256,所以一字節(jié) ASCII 的編碼最高位總是0 - ASCll 碼對(duì)應(yīng)碼表如下: ASCll 碼表
GBK
GBK即漢字內(nèi)碼擴(kuò)展規(guī)范,英文全稱Chinese Internal Code Specification.
GBK編碼標(biāo)準(zhǔn)兼容GB2312,共收錄漢字21003個(gè)、符號(hào)883個(gè),并提供1894個(gè)造字碼位,簡(jiǎn)、繁體字融于一庫(kù)。
GBK采用雙字節(jié)表示,總體編碼范圍為8140-FEFE,首字節(jié)在81-FE 之間,尾字節(jié)在40-FE 之間
Unicode
Unicode 編碼設(shè)計(jì)成了固定兩個(gè)字節(jié),所有的字符都用16位2^16=65536表示,包括之前只占8位的英文字符等,所以會(huì)造成空間的浪費(fèi)
Unicode 完全重新設(shè)計(jì),不兼容 iso8859-1 ,也不兼容任何其他編碼
UTF-8
對(duì)于英文字母, unicode 也需要兩個(gè)字節(jié)來(lái)表示, 所以 unicode 不便于傳輸和存儲(chǔ).
因此而產(chǎn)生了 UTF編碼 , UTF-8 全稱是( 8-bit UnicodeTransformation Format )
注意事項(xiàng)
- UTF 編碼兼容 iso8859-1 編碼,同時(shí)也可以用來(lái)表示所有語(yǔ)言的字符
- UTF 編碼是不定長(zhǎng)編碼,每一個(gè)字符的長(zhǎng)度從1-4個(gè)字節(jié)不等.
英文字母都是用一個(gè)字節(jié)表示,而漢字使用三個(gè)字節(jié) - 一般項(xiàng)目都會(huì)使用 UTF-8
我們之所以傾向于使用UTF-8 , 是因?yàn)槠洳欢ㄩL(zhǎng)編碼可以在節(jié)省內(nèi)存的同時(shí)能夠完全兼容中文
二、文件操作
1. 創(chuàng)建文件對(duì)象
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") -
作為入?yún)⒌拇蜷_(kāi)方式如下(經(jīng)常會(huì)用!!!)
-
文本文件對(duì)象和二進(jìn)制文件對(duì)象的創(chuàng)建
如果是二進(jìn)制模式 b ,則創(chuàng)建的是二進(jìn)制文件對(duì)象,處理的基本單元是“字節(jié)”
如果沒(méi)有增加模式 b ,則默認(rèn)創(chuàng)建的是文本文件對(duì)象,處理的基本單元是“字符”
2. 文件的寫入
文本文件的寫入一般就是三個(gè)步驟:
- 創(chuàng)建文件對(duì)象
- 寫入數(shù)據(jù)
- 關(guān)閉文件對(duì)象
基本文件的寫入操作
實(shí)操代碼
# 1.使用open()方式 f = open(r"d:\a.txt", "a") s = "TimePause\n時(shí)間靜止\n" f.write(s) f.close()結(jié)果展示
中文亂碼
代碼編寫時(shí)
windows 操作系統(tǒng)默認(rèn)的編碼是 GBK , Linux 操作系統(tǒng)默認(rèn)的編碼是 UTF- 8 .
當(dāng)我們用 open() 時(shí),調(diào)用的是操作系統(tǒng)相關(guān)api來(lái)打開(kāi)的文件,并且默認(rèn)的編碼是 GBK
但是由于我們通常習(xí)慣將所有代碼編碼都設(shè)置成 UTF- 8 ., 因此在打開(kāi)時(shí)會(huì)出現(xiàn)亂碼問(wèn)題, 如下圖所示
解決方案:
按照上圖提示, 將文本編碼設(shè)置成 GBK格式讀取即可
注意:
我們還可以通過(guò)指定編碼來(lái)解決中文亂碼問(wèn)題. 因?yàn)槲覀儗ycharm文本讀寫編碼都設(shè)置成 utf-8,
因此只要我們?cè)谖募懭氲臅r(shí)候規(guī)定編碼為 utf-8(默認(rèn)gbk), 那么我們?cè)谧x取時(shí)就不會(huì)出現(xiàn)亂碼. 如下代碼
實(shí)操代碼
# 【示例】通過(guò)指定文件編碼解決中文亂碼問(wèn)題 f = open(r"d:\bb.txt", "w", encoding="utf-8") f.write("一個(gè)有溫情的小站\n時(shí)間靜止不是簡(jiǎn)史") f.close()控制臺(tái)輸出時(shí)
問(wèn)題描述
我們一般習(xí)慣把pycharm所有字符編碼設(shè)置成utf-8時(shí). 在我們進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí), 有時(shí)候會(huì)返回亂碼問(wèn)題, 如下圖
問(wèn)題分析
因?yàn)槲覀冊(cè)?pycharm 設(shè)置所有字符編碼均為 UTF-8, 但是通過(guò)網(wǎng)絡(luò)請(qǐng)求得到GBK格式的文本, 然后我們?nèi)砸?UTF-8 編碼去解碼就會(huì)出現(xiàn)亂碼
解決方案
可以將項(xiàng)目編碼設(shè)置成GBK格式即可; 也可以通過(guò)文本操作代碼對(duì)得到的數(shù)據(jù)進(jìn)行GBK格式讀取
亦或者在寫入時(shí), 直接將編碼聲明為UTF-8
write()/writelines()寫入數(shù)據(jù)
- write(a) :把字符串 a 寫入到文件中
- writelines(b) :把字符串列表寫入文件中,不添加換行符
實(shí)操代碼
# 【操作】添加字符串列表數(shù)據(jù)到文件中 f = open(r"d:\bb.txt", 'w', encoding="utf-8") s = ["什么鬼\n"] * 3 # 通過(guò) \n實(shí)現(xiàn)手動(dòng)換行 f.writelines(s) f.close()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ì)象
注意:
- close()一般結(jié)合異常機(jī)制的 finally 一起使用
- 也可以通過(guò) with 關(guān)鍵字實(shí)現(xiàn)無(wú)論何種情況都能關(guān)閉打開(kāi)的文件對(duì)象(推薦)
實(shí)操代碼
# 【操作】結(jié)合異常機(jī)制的 finally ,確保關(guān)閉文件對(duì)象 # "a" 設(shè)置打開(kāi)方式為追加模式 try:f = open(r"d:\c.txt", "a")s = "來(lái)自深淵"f.write(s) except BaseException as e:print(e) finally:f.close()with語(yǔ)句(上下文管理器)
with關(guān)鍵字 (上下文管理器)可以自動(dòng)管理上下文資源,不論什么原因跳出 with塊 ,都能確保文件正確的關(guān)閉,
并且可以在代碼塊執(zhí)行完畢后自動(dòng)還原進(jìn)入該代碼塊時(shí)的現(xiàn)場(chǎng)
實(shí)操代碼
# 【操作】使用 with 管理文件寫入操作 s = ["齊格飛"] * 3 with open(r"d:\cc.txt", "w") as f:f.writelines(s)3. 文件的讀取
文件讀取的步驟:
- 打開(kāi)文本文件對(duì)象
- 寫入數(shù)據(jù)
文件的讀取一般使用如下三個(gè)方法:
-
read([size]): 從文件中讀取 size 個(gè)字符,并作為結(jié)果返回
如果沒(méi)有 size 參數(shù),則讀取整個(gè)文件. 讀取到文件末尾,會(huì)返回空字符串 -
readline(): 讀取一行內(nèi)容作為結(jié)果返回
讀取到文件末尾,會(huì)返回空字符串 -
readlines() : 文本文件中,每一行作為一個(gè)字符串存入列表中,返回該列表
代碼格式
with open(r"d:\a.txt", "r"[, encoding="utf-8"]) as f:f.read(4)注意:
- 在讀取文件時(shí), 需要注意讀寫時(shí)字符編碼的一致性, 如果寫的時(shí)候沒(méi)有指定編碼(默認(rèn)GBK), 則在讀取的時(shí)候也不需要指定編碼
- 但如果讀的時(shí)候未指定編碼, 寫的時(shí)候指定, 則會(huì)報(bào)錯(cuò).
例如: 寫的時(shí)候指定 encoding="utf-8",
則控制臺(tái)報(bào) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 13: invalid start byte
實(shí)操代碼
# 【操作】 讀取一個(gè)文件前4個(gè)字符 import picklewith open(r"d:\a.txt", "r") as f:print(f.read(4))# 【操作】文件較小,一次將文件內(nèi)容讀入到程序中 with open(r"d:\aa.txt", "r") as f:print(f.read())# 【操作】按行讀取一個(gè)文件 with open(r"d:\b.txt") as f:while True:lines = f.readline()if not lines: # 在python 中 if not 會(huì)將后面對(duì)象隱式轉(zhuǎn)成True或者False進(jìn)行判斷, 因此遇到空字符串也返回Falsebreakelse:print(lines, end="")print()# 【操作】使用迭代器(每次返回一行)讀取文本文件 # 寫和讀的編碼要對(duì)應(yīng) with open(r"d:\bb.txt", "r", encoding="utf-8") as f:for a in f:print(a, end="")# 【操作】為文本文件每一行的末尾增加行號(hào) with open(r"d:\c.txt", "r") as f:lines = f.readlines()lines2 = [line.rstrip() + " # " + str(index) + "\n" for index, line in zip(range(1, len(lines) + 1), lines)]with open(r"d:\c.txt", "w") as ff:ff.writelines(lines2)二進(jìn)制文件的讀取和寫入
二進(jìn)制文件的處理流程和文本文件流程一致。首先還是要?jiǎng)?chuàng)建文件對(duì)象,
創(chuàng)建好二進(jìn)制文件對(duì)象后,仍然可以使用 write() 、 read() 實(shí)現(xiàn)文件的讀寫操作
在創(chuàng)建文件對(duì)象時(shí), 首先需要指定二進(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ì)象
實(shí)操代碼
# 二進(jìn)制文件的讀取和寫入(此操作相當(dāng)于復(fù)制) # 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ì)象 with open(r"d:\aaa.png", "rb") as scrFile, open(r"d:\bbb.png", "wb") as destFile:for l in scrFile:destFile.write(l)4. 文件對(duì)象的常用屬性和方法
文件對(duì)象的屬性
文件對(duì)象的打開(kāi)模式
文件對(duì)象的常用方法
文件任意位置操作
利用 seek() 可以將讀取文件的指針移動(dòng)到指定字節(jié)位置上
一個(gè)中文字符站兩個(gè)字節(jié), 而英文只占一個(gè)字節(jié)
實(shí)操代碼
print("=================文件任意位置操作======================") # 【示例】 seek() 移動(dòng)文件指針示例 with open(r"d:\cc.txt", "r") as f:print("文件名是{0}".format(f.name)) # 文件名是d:\cc.txtprint(f.tell()) # 0print("讀取文件的內(nèi)容", str(f.readline())) # 讀取文件的內(nèi)容 齊格飛齊格飛齊格飛print(f.tell()) # 18f.seek(4, 0) # 中文占2個(gè)字節(jié), 因此在seek時(shí)需要是2的倍數(shù)print("文件讀取的內(nèi)容", str(f.readline())) # 文件讀取的內(nèi)容 飛齊格飛齊格飛print(f.tell()) # 18三、文件操作拓展模塊
1. pickle序列化模塊
序列化指的是:將對(duì)象轉(zhuǎn)化成“串行化”數(shù)據(jù)形式,存儲(chǔ)到硬盤或通過(guò)網(wǎng)絡(luò)傳輸?shù)狡渌胤?/strong>.
反序列化是指相反的過(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ì)象
實(shí)操代碼
import pickle print("=================使用pickle序列化=======================") # 【操作】將對(duì)象序列化到文件中 with open("student.info", "wb") as f:name = "時(shí)間靜止"age = 18score = [90, 80, 70]resume = {"name": name, "age": age, "score": score}pickle.dump(resume, f)# 【操作】將獲得的數(shù)據(jù)反序列化成對(duì)象 with open("student.info", "rb") as f:resume = pickle.load(f)print(resume)2. csv文件的操作
csv是逗號(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è)趀xcel中建立一個(gè)簡(jiǎn)單的表格并且另存為 csv(逗號(hào)分隔) ,我們打開(kāi)查看這個(gè)csv文件內(nèi)容
csv文件讀取
實(shí)操代碼
import csvwith open(r"d:\workBook.csv") as a:o_csv = csv.reader(a) # #創(chuàng)建csv對(duì)象,它是一個(gè)包含所有數(shù)據(jù)的列表,每一行為一個(gè)元素headers = next(o_csv) # #獲得列表對(duì)象,包含標(biāo)題行的信息print(headers)for row in o_csv: # 循環(huán)打印各行內(nèi)容print(row)結(jié)果展示
csv文件寫入
實(shí)操代碼
# 【操作】 csv.writer 對(duì)象寫一個(gè)csv文件 headers = ['姓名', '年齡', '工作', '住址'] rows = [('JOJO', '18', '按摩師', '英國(guó)'), ('迪奧', '19', '老板', '埃及'), ('喬魯諾喬巴納', '20', '混混', '意呆利')] with open(r"d:\workBook3.csv", "w") as b:b_scv = csv.writer(b) # 創(chuàng)建csv對(duì)象b_scv.writerow(headers) # 寫入一行(標(biāo)題)b_scv.writerows(rows) # 寫入多行(數(shù)據(jù))結(jié)果展示
3. os和os.path模塊
os模塊 可以幫助我們直接對(duì)操作系統(tǒng)進(jìn)行操作.
我們可以直接調(diào)用操作系統(tǒng)的可執(zhí)行文件、命令,直接操作文件、目錄等等
os模塊 是做系統(tǒng)運(yùn)維非常重要的基礎(chǔ)
os模塊-調(diào)用操作系統(tǒng)命令
實(shí)操代碼
# 【示例】 os.system 調(diào)用windows系統(tǒng)的記事本程序 os.system("notepad.exe")# 【示例】 os.system 調(diào)用windows系統(tǒng)中ping命令 # 如果出現(xiàn)亂碼, 請(qǐng)看 文件操作->文件的寫入->中文亂碼->控制臺(tái)輸出時(shí) 進(jìn)行配置 os.system("ping www.baidu.com")# 【示例】運(yùn)行安裝好的微信 os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe")os模塊-文件和目錄操作
可以通過(guò)前面講的文件對(duì)象實(shí)現(xiàn)對(duì)于文件內(nèi)容的讀寫操作.
如果還需要對(duì)文件和目錄做其他操作,可以使用 os 和 os.path 模塊.
- os 模塊下常用操作文件的方法
- os 模塊下關(guān)于目錄操作的相關(guān)方法
實(shí)操代碼
import os # 【示例】 os 模塊:創(chuàng)建、刪除目錄、獲取文件信息等 print("系統(tǒng)名稱:", os.name) # windows-->nt linux-->posix print("當(dāng)前操作系統(tǒng)所使用的路徑分隔符:", os.sep) # windows-->\ linux-->/ print("行間隔符:", repr(os.linesep)) # windows-->\r\n linux-->\n print("當(dāng)前目錄:", os.curdir)a = "3" print(a) # 返回對(duì)象的規(guī)范字符串表示 print(repr(a)) # 獲取文件和文件夾的相關(guān)信息 print(os.stat("MyPy08-FileRead.py"))# 工作目錄的操作 print(os.getcwd()) # 獲取當(dāng)前工作目錄 os.chdir("D:") # 切換當(dāng)前工作目錄 os.mkdir("學(xué)習(xí)資料大全") # 創(chuàng)建目錄 os.rmdir("學(xué)習(xí)資料大全") # 刪除目錄 # os.makedirs("人種/黃種人/中國(guó)人") # 創(chuàng)建多級(jí)目錄, 調(diào)用成功一次之后, 再次調(diào)用會(huì)報(bào)錯(cuò) # os.rename("人種", "亞洲人") # 此方法也只能調(diào)用一次 print(os.listdir("亞洲人")) # 當(dāng)前目錄下的子目錄注意事項(xiàng)
在調(diào)用 os.rename() 時(shí), 如果出現(xiàn)報(bào)錯(cuò) PermissionError: [WinError 5] 拒絕訪問(wèn),
則需要你在需要重命名的文件夾上面配置用戶的權(quán)限. 修改之后便可進(jìn)行重命名. 如下圖所示
os.path模塊
os.path 模塊提供了目錄相關(guān)(路徑判斷、路徑切分、路徑連接、文件夾遍歷)的操作
實(shí)操代碼
列出指定目錄下所有的 .py 文件,并輸出文件名
# 列出指定目錄下所有的 .py 文件,并輸出文件名 import ospath = os.getcwd() file_list = os.listdir(path)for filename in file_list:pos = filename.rfind(".")if filename[pos + 1:] == "py":print(filename, end="\t") print()walk()遞歸遍歷所有文件和目錄
os.walk() 方法是一個(gè)簡(jiǎn)單易用的文件、目錄遍歷器,可以幫助我們高效的處理文件、目錄方面的事情
格式如下: os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
- top :是要遍歷的目錄。 topdown :可選, True ,先遍歷 top 目錄再遍歷子目錄
- 返回三元組( root 、 dirs 、 files ):
root :當(dāng)前正在遍歷的文件夾本身
dirs :一個(gè)列表,該文件夾中所有的目錄的名字
files :一個(gè)列表,該文件夾中所有的文件的名字
實(shí)操代碼
# 【示例】使用 walk() 遞歸遍歷所有文件和目錄 path = os.getcwd()[:os.getcwd().rfind("\\")] # 獲取上級(jí)路徑, 作用是能夠輸出更多的文件 file_list = os.walk(path, topdown=False)for root, dirs, files in file_list:for name in files:print(os.path.join(root, name))for name in dirs:print(os.path.join(root, name)) # 用于拼接目錄輸出結(jié)果
遞歸遍歷目錄下所有文件
實(shí)操代碼
# 【示例】使用遞歸算法遍歷目錄下所有文件 def my_print_file(path, level):child_files = os.listdir(path)for file in child_files:file_path = os.path.join(path, file)print("\t" * level + file_path[file_path.rfind(os.sep)+1:])if os.path.isdir(file_path):my_print_file(file_path, level + 1)my_print_file(path, 0)4. shutil模塊(拷貝和壓縮)
shutil 模塊是python標(biāo)準(zhǔn)庫(kù)中提供的,主要用來(lái)做文件和文件夾的拷貝、移動(dòng)、刪除等;
還可以做文件和文件夾的壓縮、解壓縮操作. os 模塊提供了對(duì)目錄或文件的一般操作.
shutil 模塊作為補(bǔ)充,提供了移動(dòng)、復(fù)制、壓縮、解壓等操作,這些 os 模塊都沒(méi)有提供
實(shí)操代碼-拷貝
import shutil # 【示例】實(shí)現(xiàn)文件的拷貝 os.chdir("D:") # 切換當(dāng)前工作目錄 shutil.copyfile("a.txt", "a_copy.txt")# 【示例】實(shí)現(xiàn)遞歸的拷貝文件夾內(nèi)容(使用 shutil 模塊) shutil.copytree("亞洲人/黃種人", "人種", ignore=shutil.ignore_patterns("*.html", "*htm")) # "音樂(lè)"文件夾不存在才能用實(shí)操代碼-壓縮與解壓
# 【示例】實(shí)現(xiàn)將文件夾所有內(nèi)容壓縮(使用 shutil 模塊) # 將"亞洲人/黃種人"文件夾下所有內(nèi)容壓縮到"生物資料"文件夾下生成race.zip shutil.make_archive("生物資料/race", "zip", "亞洲人/黃種人")# 壓縮:將指定的多個(gè)文件壓縮到一個(gè)zip文件 z = zipfile.ZipFile("a.zip", "w") z.write("a.txt") z.write("b.txt") z.close()# 【示例】實(shí)現(xiàn)將壓縮包解壓縮到指定文件夾(使用 shutil 模塊) z2 = zipfile.ZipFile("a.zip", "r") z2.extractall("d:/生物資料") z2.close()總結(jié)
以上是生活随笔為你收集整理的Python升级之路( Lv9 ) 文件操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: l3gd20陀螺仪精度_L3GD20H陀
- 下一篇: charles https 抓包