今天學了python3 的文件系統,高大上啊~~~~ 1、os模塊和 os.path模塊 os模塊中文件目錄和函數的使用方法 os.path模塊中關於路徑常用的函數使用方法 分割文件名與路徑,返回(f_path,f_name)形式的元組,如果都是目錄,他也會將最後一個目錄作為文件分離 ,且不會判斷文 ...
今天學了python3 的文件系統,高大上啊~~~~
1、os模塊和 os.path模塊
os模塊中文件目錄和函數的使用方法
函數 | 使用方法 |
getcwd() | 返回當前工作目錄 |
chdir(path) | 改變工作目錄 |
listdir(path='.') | 列舉指定目錄中的文件名(‘.’表示當前陌路‘..’表示上一級目錄) |
mkdir(path) | 創建單層目錄,如果目錄已存在則拋出異常 |
makedirs(path) | 創建多層目錄,如果目錄已存在則拋出異常 註意:E:\\a\\c和E:\\a\\b不會衝突 |
remove(path) | 刪除文件 |
rmdir(path) | 刪除單層目錄,如果該目錄非空則拋出異常 |
removedirs(path) | 遞歸刪除目錄,從子目錄到父目錄逐層嘗試刪除,遇到目錄非空則拋出異常 |
rename(old,new) | 將文件old重命名為new |
system(commend) | 運行系統的shell命令 |
walk(top) | 遍歷top路徑以下所有的子目錄,返回一個三元組(路徑,[包含目錄],[包含文件]) |
以下是支持路徑操作中常用到的一些定義,支持所有平臺 | |
os.curdir | 指代當前目錄'.' 用os.curdir表示當前目錄更準確(怡紅院來者不拒哈哈哈) |
os.pardir | 指代上一級目錄‘..’ |
os.sep | 輸出操作系統特定的路徑分割符(WIN下為'\\'Linux下為'/') |
os.linesep | 當前操作系統下的行終止符(win下為'\r\n' Linux下為'\n') |
os.name | 指代當前的操作系統(‘posix’ ‘nt’ ‘mac’ ‘os2’ ‘ce’ ‘java’)打到這到這覺得Python好好用... |
os.path模塊中關於路徑常用的函數使用方法
函數名 | 使用方法 |
basename(path) | 去掉目錄路徑單獨返迴文件名 |
dirname(path) | 去掉文件名單獨返回目錄路徑 |
join(path1[,path[,...]]) | 將path1和path2各部分組合成一個路徑名 |
split(path) |
分割文件名與路徑,返回(f_path,f_name)形式的元組,如果都是目錄,他也會將最後一個目錄作為文件分離 ,且不會判斷文件或者目錄是否存在 |
splitext(path) | 分離文件名和擴展名返回(f_name,f_ext)形式的元組
>>> import os |
getsize(file) | 返回指定文件尺寸,大小為位元組 |
getatime(file) | 返回指定文件最近的訪問時間(浮點型秒數,可用time模塊的gmtime()和localtime()轉換) |
getctime(file) | 返回指定文件的創建時間(浮點型秒數,可用time模塊的gmtime()和localtime()轉換) |
getmtime(file) | 返回指定文件最新修改時間(浮點型秒數,可用time模塊的gmtime()和localtime()轉換) |
以下函數返回True or False | |
exists(path) | 判定指定路徑(文件或目錄)是否存在 |
isabs(path) | 判斷路徑是否為絕對路徑 絕對路徑:E:\\A\\B\\text.txt 相對路徑:A\\B\\text.tx |
isdir(path) | 判斷路徑是否存在且一個目錄 |
isfile(path) | 判斷路徑是否存在且是一個文件 |
islink(path) | 判斷路徑是否存在且是一個符號鏈接 |
ismount(path) | 判斷路徑是否存在且是一個掛載點 :E:\\ C:\\ |
samefile(path1,path2) | 判斷兩個路徑是否指向同一個文件 |
例題:
1、統計當前目錄下每個文件類型個數(改進版)
import os c=os.getcwd() name_in_file=os.listdir(c) def count_filetype(name): count=0 content=[]#用來存儲該路徑下所有擴展名 for each_name in name_in_file: Suffix=os.path.splitext(each_name) content.append(Suffix[1]) type_count=set(content)#集合里的元素是唯一的,這樣就可以把相同的擴展名去掉得到文件含有的擴展名 #print(type_count) for Extension in type_count: for Splited_Ext in content: if Extension == Splited_Ext: if Extension=='': Extension='文件夾' count+=1 print('該文件夾下共有類型為【%s】的文件 %d 個'%(Extension,count)) count=0#統計完一次計數器清零 return 1 count_filetype(name_in_file)
2、輸入文件名搜索指定文件夾是否存在該文件
import os def Find_Aim_File(path,file_name): os.chdir(path)#1.改變工作路徑 container = os.walk(os.getcwd())#2.獲取當前工作路徑,3.遍歷該路徑下所有子目錄 for each in container: for each_name in each[2]: if each_name == file_name: print(each[0]+os.sep+each_name) Initial_direct=input('請輸入查找的初始目錄:') Target_File=input('請輸入需要查找的目標文件:') Find_Aim_File(Initial_direct,Target_File)
3、計算工作目錄下各個文件的大小
import os c=os.getcwd()#返回當前工作目錄 #使用os.curdir 表示當前目錄更標準 List_File_Nname=os.listdir(c)#列舉該目錄下的文件名,返回一個列表 def Get_File_Size(list_file_name): for each_name in list_file_name: print("%s【%d Bytes】"%(each_name,os.path.getsize(each_name))) Get_File_Size(List_File_Nname)
4、查找指定路徑的視頻文件,並保存路徑為文本文檔(AV沒地方藏了doge臉)
import os def Find_Vedio(directory,save_path): flag=0 save_data=[] os.chdir(directory)#改變工作目錄 container=os.walk((os.getcwd()))#獲取當前工作目錄#遍歷該目錄下所有子目錄 for sub_directory in container: for each_file_name in sub_directory[2]: splited_file_name=os.path.splitext(each_file_name)#返回[文件名,擴展名] if splited_file_name[1] in ['.avi','.mp4','.rmvb']: #vedio_name=(sub_directory[0]+'\\'+each_file_name+'\n') vedio_name=(sub_directory[0]+os.sep+each_file_name+os.linesep)#改成這句使程式更標準 save_data.append(vedio_name) print(vedio_name) flag=1 save_txt=open(save_path,'w') print('保存中.....') save_txt.writelines(save_data) save_txt.close() print('主人我已為你打包完畢~~') if flag==0: print('真是不看片的好小伙!居然找不到!!!') print('請輸入待查找的初始目錄:',end='') while 1: initial_directory = input() print('請輸入保存路徑(預設為【E:\\vedioList.txt】):',end='') Savepath=input() if Savepath=='': Savepath='E:/vedioList.txt' if ':\\' not in initial_directory and ':\\'not in Savepath: print("格式錯誤請重新輸入:",end='') continue else: print('查找中....') Find_Vedio(initial_directory,Savepath) print('感謝使用') break
5、查找當前文件夾內文本文檔內是否含有關鍵字並輸出位置
import os path=os.getcwd() container=os.walk(path) def find_txt(path): txt_name_container=[]#存放文本文件文件名 for each_path in container:#each_path的格式為(路徑,[包含目錄],[包含文件]) for each_file_name in each_path[2]: splited_name=os.path.splitext(each_file_name)#將文件名和擴展名拆分返回一個列表 if splited_name[1]=='.txt': #file_path=each_path[0]+'\\'+each_file_name#得到文本文件路徑 file_path=os.path.join(each_path[0],each_file_name)#上面這句話可以改成這一句 txt_name_container.append(file_path)#將文本文件路徑存入列表 return txt_name_container def find_keyword(target_file_list,key_word,c): positions=[] flag=0 for each_file_name in target_file_list: row=0 txt_file=open(each_file_name)#以只讀文本方式打開文件 for each_line in txt_file: if key_word in each_line: print('===================================================') print('在文件【%s】中找到關鍵字【%s】'%(each_file_name,key_word)) flag=1 txt_file.close() break if flag==0: print("沒有在該文件夾中找到關鍵字!") break elif flag==1 and c in ['YES','yes','y','Y']: txt_file=open(each_file_name) for each_line in txt_file: end=len(each_line) #print(end) row+=1 for start in range(end): p=(each_line.find(key_word,start,end)+1) #print(p) if p!=0 and p not in positions: positions.append(p) if positions : print('關鍵字出現在第%d行第%s個位置'%(row,positions)) positions=[] txt_file.close()