天天看點

Python 3 教程二:檔案,目錄和路徑

import  os

import  os.path

#  os,os.path裡包含大多數檔案通路的函數,是以要先引入它們.

#  請按照你的實際情況修改這個路徑

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  ( " 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".

'''

# 常用函數有三種:分隔路徑,找出檔案名.找出盤符(windows系統),找出檔案的擴充名.

# 根據你機器的實際情況修改下面參數.

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)

    知識點:    這三個函數都傳回二進制組.

    * case1 分隔目錄和檔案名

    * case2 分隔盤符和檔案名

    * case3 分隔檔案和擴充名

總結:5個函數

os.walk(spath)

os.path.split(spath)

os.path.splitdrive(spath)

os.path.splitext(spath)

os.path.join(path1,path2)

import  shutil

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()

# 測試複制檔案夾樹

try :

    srcDir = " d:/download/test "

    dstDir = " d:/download/test2 "

     # 如果dstDir已經存在,那麼shutil.copytree方法會報錯!

     # 這也意味着你不能直接用d:作為目标路徑.

    shutil.copytree(srcDir, dstDir)

except  Exception as err:

     print  (err)

    知識點:

    * shutil.copyfile:如何複制檔案

    * os.path.exists:如何判斷檔案夾是否存在

    * shutil.copytree:如何複制目錄樹    

總結:4個函數

os.path.dirname(path)

os.path.exists(path)

shutil.copyfile(src, dst)

shutil.copytree(srcDir, dstDir)

import  datetime

作用:将目錄備份到其他路徑。

實際效果:

假設給定目錄"/media/data/programmer/project/python" ,

備份路徑"/home/diegoyun/backup/“ ,

則會将python目錄備份到備份路徑下,形如:

/home/diegoyun/backup/yyyymmddHHMMSS/python/xxx/yyy/zzz

Python 3 教程二:檔案,目錄和路徑

..

用法:更改這兩個參數.

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()

轉自  http://www.cnitblog.com/yunshichen/archive/2009/04/01/55931.html