本章介介紹了shutil,zipfile模塊的使用,我們先來認識一下這2個模塊吧。 一.shutil模塊 shutil模塊主要用於對文件或文件夾進行處理,包括:複製,移動,改名和刪除文件,在shutil模塊中主要以下這麼幾個函數: 1.複製文件和文件夾 shutil模塊提供了2個函數:shutil. ...
本章介介紹了shutil,zipfile模塊的使用,我們先來認識一下這2個模塊吧。
一.shutil模塊
shutil模塊主要用於對文件或文件夾進行處理,包括:複製,移動,改名和刪除文件,在shutil模塊中主要以下這麼幾個函數:
1.複製文件和文件夾
shutil模塊提供了2個函數:shutil.copy()和shutil.copytree()
shutil.copy的語法格式:
copy(src, dst)
作用:
將src處的文件複製到dst路徑中去,其中src,dst都是字元串形式的路徑。如果dst是一個文件名,它將作為被覆制文件的新名字,相當於把原路徑的文件複製到新路徑並改名。
舉例:
將/etc/my.cnf 複製到/root/mysql中
In [12]: import shutil
In [13]: shutil.copy('/etc/my.cnf','/root/mysql/')
Out[13]: '/root/mysql/my.cnf'
In [15]: ll /root/mysql/
total 4
-rw-r--r--. 1 root 960 Apr 22 16:57 my.cnf
將/etc/my.cnf複製到/root/mysql並改名為mysql.cnf
In [16]: shutil.copy('/etc/my.cnf','/root/mysql/mysql.cnf')
Out[16]: '/root/mysql/mysql.cnf'
In [17]: ll /root/mysql/
total 8
-rw-r--r--. 1 root 960 Apr 22 16:57 my.cnf
-rw-r--r--. 1 root 960 Apr 22 17:00 mysql.cnf
shutil.copytree的語法格式:
copytree(src, dst)
作用:
複製整個文件夾。將src處的文件夾,包括它的所有文件和子文件夾,複製到路徑dst處的文件夾。返回一個新複製的文件夾路徑的字元串。
舉例:
In [20]: shutil.copytree('/etc/yum.repos.d','/root/repo.back')
Out[20]: '/root/repo.back'
In [21]: ll /root/drwxr-xr-x. 2 root 4096 Apr 23 2017 repo.back/
drwxr-xr-x. 2 root 4096 Apr 23 2017 repo.bak/
註意:dst必須是一個系統中不存在目錄,不然會報錯:
In [20]: shutil.copytree('/etc/yum.repos.d','/root/repo.bak')
FileExistsError: [Errno 17] File exists: '/root/repo.bak'
2.文件和文件夾的移動和改名
shutil.move()
語法格式:
move(stc,dst)
作用:
將路徑stc處的文件夾移動到路徑dst,並返回新位置的絕對路徑的字元串。
舉例:
將/root/目錄下的a.txt移動到/root/test/目錄中
In [26]: shutil.move('/root/a.txt','/root/test/')
Out[26]: '/root/test/a.txt'
In [27]: ll /root/test
total 4
-rw-r--r--. 1 root 6 Apr 22 17:30 a.txt
註意:
如果dst指向一個文件夾,src文件將移動到dst中,並保持原來的文件名,前提是dst必須是系統中已經存在的目錄。
如果目標文件中已存在相同名稱的文件將被覆蓋,需要註意。
3.刪除文件和文件夾
在os模塊中:
os.remove(path)可以刪除一個文件
os.rmdir(path)可以刪除一個空文件夾。
在shutil模塊中:
shutil.rmtree(path)可以刪除一個文件夾及其所有的內容。
語法格式:
os.rmdir(path)
shutil.rmtree(path)
舉例:
1 In [34]: os.remove('/root/test/a.txt')
2
3 In [35]: ll /root/test/
4 total 0
5
6 In [36]: shutil.move('/root/CentOS-Base.repo','/root/test/')
7 Out[36]: '/root/test/CentOS-Base.repo'
8
9 In [37]: ll test
10 total 4
11 -rw-r--r--. 1 root 2573 Apr 23 2017 CentOS-Base.repo
12
13 In [38]: shutil.rmtree('/root/test')
14
15 In [39]: ll
16 total 12
17 -rw-------. 1 root 1468 Apr 16 21:03 anaconda-ks.cfg
18 drwxr-xr-x. 2 root 57 Apr 23 2017 download/
19 drwxr-xr-x. 2 root 37 Apr 22 17:00 mysql/
20 drwxr-xr-x. 6 root 95 Apr 16 21:58 py34/
21 drwxr-xr-x. 3 root 18 Apr 16 23:01 python/
22 drwxr-xr-x. 2 root 4096 Apr 23 2017 repo.back/
23 drwxr-xr-x. 2 root 4096 Apr 23 2017 repo.bak/
註意:
以上的刪除都是永久的刪除。為了安全起見最好使用send2trash第三方模塊,它會將刪除的文件放入回收站。在python3中已集成了這個模塊。
send2trash用法:
import send2trash
send2trash(path)
二.遍歷目錄樹
對文件的處理,尤其是批量操作就不得不對目錄進行遍歷。在python中os模塊中的os.walk()函數就可以做到。
這個函數會遞歸遍歷指定目錄及子目錄,返回一個3元組信息:當前目錄名,子目錄名,文件名,不包括 . 和 ..
常見用法:
#!/usr/bin/env python3.4 #coding:utf-8 import os for foldName,subfolders,filenames in os.walk('/root/'): print('The current folder is: ' + foldName) for subfolder in subfolders: print('subfolder of ' + foldName + ':' + subfolder) for filename in filenames: print('file inside ' + foldName + ':' + filename) print('')
三.實踐項目參考答案
1 #!/usr/bin/env python3.4
2 # coding:utf-8
3 import os
4 import shutil
5 import send2trash
6
7 # 9.8.1
8 # 拷貝指定格式文件到指定目錄,下麵程式是將/etc目錄下所的.conf文件拷貝到/root/test/目錄里。
9 src = '/etc/'
10 dst = '/root/test/'
11 ftype = '.conf'
12 count = 0
13 for filename in os.listdir(src):
14 if filename.endswith(ftype):
15 shutil.copy(src + filename,dst)
16 count += 1
17 print('文件 ' + src + filename + '\t被拷貝到---> ' + dst + ' 目錄下')
18 print("該目錄下所有的 " + ftype + "文件已被拷貝到" + dst + "目錄下")
19 print('共拷貝了 ' + str(count) + ' 個文件')
20
21 # 9.8.2
22 # 搜索指定目錄下大於100M的文件,列印出來並刪除
23 # 可以手動創建一個指定大小的空文件做試驗
24 # dd if=/dev/zero of=hello.txt bs=100M count=1
25 for foldname,subfolders,filenames in os.walk(dst):
26 for files in filenames:
27 if os.path.getsize(dst + files) / 1024 /1024 > 100:
28 print('大於100M的文件有:' + files + ' ' + str(os.path.getsize(dst + files) / 1024 / 1024) +'Mb')
29 send2trash.send2trash(dst + files)
30
31 # 9.8.3
32 #