遍歷文件夾和文件 import os
import os.path # os,os.path里包含大多數(shù)文件訪問的函數(shù),所以要先引入它們. # 請按照你的實際情況修改這個路徑 rootdir = " d:/download " for parent, dirnames, filenames in os.walk(rootdir): # case 1: for dirname in dirnames: print ( " parent is: " + parent) print ( " dirname is: " + dirname) # case 2 for filename in filenames: print ( " parent is: " + parent) print ( " filename with full path : " + os.path.join(parent, filename)) ''' 知識點: * os.walk返回一個三元組.其中dirnames是所有文件夾名字(不包含路徑),filenames是所有文件的名字(不包含路徑).parent表示父目錄. * case1 演示了如何遍歷所有目錄. * case2 演示了如何遍歷所有文件. * os.path.join(dirname,filename) : 將形如"/a/b/c"和"d.java"變成/a/b/c/d.java". '''
2 分割路徑和文件名
import os.path
# 常用函數(shù)有三種:分隔路徑,找出文件名.找出盤符(windows系統(tǒng)),找出文件的擴展名. # 根據(jù)你機器的實際情況修改下面參數(shù). spath = " D:/download/repository.7z " # case 1: p,f = os.path.split(spath); print ( " dir is: " + p) print ( " file is: " + f) # case 2: drv,left = os.path.splitdrive(spath); print ( " driver is: " + drv) print ( " left is: " + left) # case 3: f,ext = os.path.splitext(spath); print ( " f is: " + f) print ( " ext is: " + ext) ''' 知識點: 這三個函數(shù)都返回二元組. * case1 分隔目錄和文件名 * case2 分隔盤符和文件名 * case3 分隔文件和擴展名 ''' 總結(jié):5個函數(shù)
3 復(fù)制文件import shutil
import os import os.path src = " d:\\download\\test\\myfile1.txt " dst = " d:\\download\\test\\myfile2.txt " dst2 = " d:/download/test/測試文件夾.txt " dir1 = os.path.dirname(src) print ( " dir1 %s " % dir1) if (os.path.exists(src) == False): os.makedirs(dir1) f1 = open(src, " w " ) f1.write( " line a\n " ) f1.write( " line b\n " ) f1.close() shutil.copyfile(src, dst) shutil.copyfile(src, dst2) f2 = open(dst, " r " ) for line in f2: print (line) f2.close() # 測試復(fù)制文件夾樹 try : srcDir = " d:/download/test " dstDir = " d:/download/test2 " # 如果dstDir已經(jīng)存在,那么shutil.copytree方法會報錯! # 這也意味著你不能直接用d:作為目標(biāo)路徑. shutil.copytree(srcDir, dstDir) except Exception as err: print (err) ''' 知識點: * shutil.copyfile:如何復(fù)制文件 * os.path.exists:如何判斷文件夾是否存在 * shutil.copytree:如何復(fù)制目錄樹 ''' 總結(jié):4個函數(shù)
4 實戰(zhàn):文件備份小程序
import os
import shutil import datetime ''' 作用:將目錄備份到其他路徑,。 實際效果: 假設(shè)給定目錄"/media/data/programmer/project/python" , 備份路徑"/home/diegoyun/backup/“ ,, 則會將python目錄備份到備份路徑下,,形如: /home/diegoyun/backup/yyyymmddHHMMSS/python/xxx/yyy/zzz.. 用法:更改這兩個參數(shù). backdir:備份目的地. copydirs:想要備份的文件夾. ''' def mainLogic(): # add dirs you want to copy backdir = " d:\\test " print (backdir) copydirs = [] copydirs.append( " d:\\temp " ); # copydirs.append("d:\\test"); print ( " Copying files =================== " ) start = datetime.datetime.now() # gen a data folder for backup backdir = os.path.join(backdir,start.strftime( " %Y-%m-%d " )) # print("backdir is:"+backdir) kc = 0 for d in copydirs: kc = kc + copyFiles(d,backdir) end = datetime.datetime.now() print ( " Finished! =================== " ) print ( " Total files : " + str(kc) ) print ( " Elapsed time : " + str((end - start).seconds) + " seconds " ) def copyFiles(copydir,backdir): prefix = getPathPrefix(copydir) # print("prefix is:"+prefix ) i = 0 for dirpath,dirnames,filenames in os.walk(copydir): for name in filenames: oldpath = os.path.join(dirpath,name) newpath = omitPrefix(dirpath,prefix) print ( " backdir is: " + backdir ) newpath = os.path.join(backdir,newpath) print ( " newpath is: " + newpath) if os.path.exists(newpath) != True: os.makedirs(newpath) newpath = os.path.join(newpath,name) print ( " From: " + oldpath + " to: " + newpath) shutil.copyfile(oldpath,newpath) i = i + 1 return i def getPathPrefix(fullpath): # Giving /media/data/programmer/project/ , get the prefix # /media/data/programmer/ l = fullpath.split(os.path.sep) # print(str(l[-1]=="") if l[ - 1 ] == "" : tmp = l[ - 2 ] else : tmp = l[ - 1 ] return fullpath[0:len(fullpath) - len(tmp) - 1 ] def omitPrefix(fullpath,prefix): # Giving /media/data/programmer/project/python/tutotial/file/test.py , # and prefix is Giving /media/data/programmer/project/, # return path as python/tutotial/file/test.py return fullpath[len(prefix) + 1 :] mainLogic() |
|