Python操作文件和目录
讀寫文件比較簡單,有一點(diǎn)特別注意就好了
windows下Python默認(rèn)打開的文件以gbk解碼,而一般我們的文件是utf-8編碼的,所以如果文本含有中文,就會(huì)出現(xiàn)異常或者亂碼。此時(shí)手動(dòng)添加encoding='utf-8'表示以utf-8的方式打開。
當(dāng)然Python寫入時(shí)候,也是默認(rèn)以gbk的編碼寫入。而文件通常是utf-8格式保存的,所以若不指定寫入的編碼方式,一寫入中文就是亂碼了
with open('abc.txt', encoding='utf-8') as f:print(f.read()) # 這樣打開文件有中文也不怕# 當(dāng)然Python寫入時(shí)候,默認(rèn)以gbk的編碼寫入。而文件是utf-8格式保存的,所以不指定寫入的編碼方式,一寫入中文就是亂碼了with open('abc.txt', 'w', encoding='utf-8') as f:f.write('你好')好了進(jìn)入正題
os模塊
當(dāng)前工作目錄
下面的代碼可獲取/切換當(dāng)前工作目錄,也就是.代表的路徑
import osprint(os.getcwd()) # F:\PythonProject os.chdir(r'D:\python') print(os.getcwd()) # D:\python print(os.path.abspath('.')) # D:\python# 由于工作目錄切換到D:\python,所以這個(gè)aa.txt就在其下生成 with open('aa.txt', 'w', encoding='utf-8') as f:f.write('你好')os.chdir可以切換當(dāng)前的工作目錄,也就是改變了.所指向的目錄。于是相對路徑aa.txt就在切換后的路徑下生成。這兩個(gè)路徑表達(dá)同一個(gè)意思
- aa.txt
- .\aa.txt
還有兩個(gè)點(diǎn),表示當(dāng)前目錄的父目錄。..\aa.txt這樣就是D:\aa.txt的意思了。
絕對路徑和相對路徑
- 絕對路徑指的是從根文件夾子(盤符)開始
- 相對路徑是相對于當(dāng)前工作目錄
上面的代碼,第一個(gè)函數(shù)返回參數(shù)路徑的絕對路徑,第二個(gè)函數(shù)用于檢查一個(gè)路徑是否是相對路徑。
獲取最后一個(gè)斜杠前后的路徑。
# 獲取最后一個(gè)斜杠后面的部分 print(os.path.basename(r'D:\python\aa.txt')) # aa.txt print(os.path.dirname(r'D:\python\aa.txt')) # D:\python # 當(dāng)然使用下面的函數(shù)可以同時(shí)獲得以上兩者 print(os.path.split(r'D:\python\aa.txt')) # ('D:\\python', 'aa.txt')以其他方式分割
print(os.path.splitext(r'D:\python\aa.txt')) # ('D:\\python\\aa', '.txt') print(os.path.splitdrive(r'D:\python\aa.txt')) # ('D:', '\\python\\aa.txt')os.path.splitext這個(gè)函數(shù)以可以方便地獲取文件后綴名,如果提供地路徑是文件夾,那么返回空。
os.path.splitdrive以盤符作為分隔。
注意,它們都返回元組。
檢查路徑
檢查一個(gè)路徑存不存在,是文件?還是文件夾?
print(os.path.isfile('D:\python')) # False print(os.path.isdir('D:\python')) # True print(os.path.exists('D:\python')) # True創(chuàng)建文件夾
os.mkdir('D:\good') # True 只能建立一級不存在的目錄,若已存在會(huì)報(bào)錯(cuò) os.mkdir('D:\good\job') # True 注釋掉上一句,由于D:\good已經(jīng)存在,這里相當(dāng)于還是只新建了一級不存在的目錄 os.mkdir(r'D:\aa\bb') # 報(bào)錯(cuò)!!由于aa和bb文件夾都不存在,找不到D:\aa路徑,故不能創(chuàng)建os.makedirs(r'D:\aa\bb') # 此函數(shù)沒有上上面的限制,管他存不存在一股腦兒創(chuàng)建,反正最后會(huì)生成此路徑就是了。不過如果此路徑已經(jīng)存在了,就會(huì)報(bào)錯(cuò)了由此可以看出os.makedirs更常用,可以創(chuàng)建處路徑里所有的文件夾。而os.mkdir還必須保證上級目錄存在,所以只能新建一級目錄。
連接路徑
print(os.path.join(r'D:\python', 'aa.txt')) # D:\python\aa.txt這個(gè)函數(shù)也很常用,用于連接兩個(gè)路徑,組合成新路徑返回。
遍歷文件夾
# 返回元組,分別是當(dāng)前文件夾路徑, 當(dāng)前路徑下的子文件夾,當(dāng)前路徑下的文件 for current_path, subfolders, filesname in os.walk(r'D:\Cleaner'):print(f'{current_path}\n{subfolders}\n{filesname}')print('-'*30)os.walk可以遞歸遍歷給定路徑下所有地文件和文件夾。看下該目錄下這個(gè)函數(shù)會(huì)打印什么。這個(gè)函數(shù)會(huì)返回一個(gè)元組,分別是(當(dāng)前路徑, 該路徑下的所有文件夾, 該路徑下的所有文件),然后不斷遞歸深入,不斷返回這樣的元組。所以上面的for循環(huán)執(zhí)行了多次,直到路徑最深處。
D:\Cleaner ['CCleaner'] ['desktop.ini'] ------------------------------ D:\Cleaner\CCleaner ['Lang'] ['branding.dll', 'business.dat', 'CCleaner.dat', 'CCleaner.exe', 'ccleaner.ini', 'CCleaner64.exe', 'portable.dat'] ------------------------------ ....刪除文件/文件夾
# 永久刪除,不進(jìn)入回收站 os.remove(r'D:\aaaa.txt') # same as os.unlink() # 目錄為空才能刪除, 只是刪除當(dāng)前文件夾 os.rmdir(r'D:\aaa\bbb\ccc\eee') # 這個(gè)方法也不能刪除非空目錄,但是刪除了空文件夾子eee后若發(fā)現(xiàn)父級文佳夾也空就一并刪除 os.removedirs(r'D:\aaa\bbb\ccc\eee') # 剩下D:\aaa\bbb # 強(qiáng)力,該目錄下所有文件/文件夾全部刪除,不管內(nèi)容空不空。慎用 shutil.rmtree(r'D:\aaa')重命名
# 重命名文件夾,必須保證原路徑存在,目標(biāo)路徑不能已存在 os.rename(r'D:\python', 'D:\good') # 重命名文件,必須保證原路徑存在,目標(biāo)路徑不能已存在 os.rename(r'D:\good\aa.txt', r'D:\good\bb.txt')# 上面都不能再目標(biāo)地址存在的情況下使用,這個(gè)函數(shù)粗暴,如果目標(biāo)路徑已存在,則會(huì)覆蓋之,慎用 os.replace(r'D:\good\bb.txt', r'D:\good\cc.txt')獲取文件的大小
得到文件的大小,以字節(jié)為單位
print(os.path.getsize(r'D:\good\cc.txt'))shutil模塊
os模塊的功能相當(dāng)強(qiáng)大,但是還有部分功能,比如復(fù)制/剪切文件和文件夾存在與shutil模塊中。
直接看代碼吧
copy
# 如果Movie目錄存在,則是把這個(gè)文件復(fù)制到了該目錄下。 des1 = shutil.copy(r'D:\findall.txt', r'E:\Movie') # 如果沒有該目錄,則新建Mov文件,無后綴名 des2= shutil.copy(r'D:\findall.txt', r'E:\Mov') # 當(dāng)然指定了后綴名,就把源文件復(fù)制過去并重命名 des2= shutil.copy(r'D:\findall.txt', r'E:\Mov.txt') # copy只復(fù)制最后訪問時(shí)間 des3 = shutil.copy(r'D:\findall.txt', r'E:\findit.txt') # copy2同時(shí)拷貝所有元數(shù)據(jù)包括修改時(shí)間和最后訪問時(shí)間 des4 = shutil.copy2(r'D:\findall.txt', r'E:\find.txt') # 不拷貝訪問時(shí)間和修改時(shí)間 des5 = shutil.copyfile(r'D:\findall.txt', r'E:\findaa.txt') # 可以看到返回的是新文件所在的路徑 print(f'{des1}\n{des2}\n{des3}') # 拷貝整個(gè)文件夾(里面所有內(nèi)容)到另外一個(gè)文件夾,該文件夾不能是已經(jīng)存在的文件夾 shutil.copytree(r'D:\abc', r'E:\Movie')move
# 剪切文件, abc不存在就移動(dòng)文件并改名為abc, abc目錄存在則放入該目錄 shutil.move(r'D:\findall.txt', r'E:\abc') # 目標(biāo)地址若是文件,則是移動(dòng)并重命名 shutil.move(r'D:\findall.txt', r'E:\aa.txt') # 剪切文件夾,如果目標(biāo)目錄已經(jīng)存在,則剪切并放入該目錄,如果目標(biāo)目錄不存在,則相當(dāng)于移動(dòng)目錄到目標(biāo)地址并重命名文件夾 shutil.move(r'D:\abc', r'E:\avb')ok,對文件和目錄的操作也是日常生活中經(jīng)常會(huì)使用到的。學(xué)習(xí)了這些已經(jīng)可以自動(dòng)完成很多操作了。
轉(zhuǎn)載自https://www.cnblogs.com/sun-haiyu/p/7082058.html
總結(jié)
以上是生活随笔為你收集整理的Python操作文件和目录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高德地图怎么搜索marker_2018-
- 下一篇: 抓包工具Stream之接口调试和加密解码