shutil子產品
shutil子產品中包含一些函數,提供複制、移動、改名和删除檔案的功能。要使用shutil的函數,首先需要import shutil。
調用shutil.copy(source,destination),将路徑source處的檔案複制到路徑destination處的檔案夾(source和destination都是字元串)。如果destination是一個檔案名,它将作為被複制檔案的新名字。該函數傳回一個字元串,表示被複制檔案的路徑。
shutil.copy()将複制一個檔案,shutil.copytree()将複制整個檔案夾,以及它包含的檔案夾和檔案。shutil.copytree()函數傳回一個字元串,是新複制的檔案夾的路徑。
<code>>>> </code><code>import</code> <code>shutil,os</code>
<code>>>> os.chdir(</code><code>'/tmp/'</code><code>)</code>
<code>>>> shutil.copy(</code><code>'./1.txt'</code><code>,</code><code>'/tmp/newdir/'</code><code>)</code>
<code>'/tmp/newdir/1.txt'</code>
<code>>>> shutil.copy(</code><code>'./1.txt'</code><code>,</code><code>'/tmp/newdir/2.txt'</code><code>)</code>
<code>'/tmp/newdir/2.txt'</code>
<code>>>> </code><code>import</code> <code>os,shutil</code>
<code>>>> shutil.copytree(</code><code>'/tmp/newdir'</code><code>,</code><code>'/usr/local/newdir_backup'</code><code>)</code>
<code>'/usr/local/newdir_backup'</code>
調用shutil.move(source,destination),将路徑source處的檔案夾移動到路徑destination,并傳回新位置的絕對路徑的字元串。
如果找不到destination的檔案夾,python會假定destination指的是一個檔案,而非檔案夾。
構成目的地的檔案夾必須已經存在,否則python會抛出異常。
<code>>>> </code><code>import</code> <code>shutil</code>
<code>>>> shutil.move(</code><code>'/usr/local/newdir_backup'</code><code>,</code><code>'/tmp/newdir/'</code><code>)</code>
<code>'/tmp/newdir/newdir_backup'</code>
利用os子產品中的函數,可以删除一個檔案或一個空檔案夾。但利用shutil子產品,可以删除一個檔案夾及其所有的内容。
用os.unlink(path)将删除path處的檔案。
調用os.rmdir(path)将删除path處的檔案夾。該檔案夾必須為空,其中沒有任何檔案和檔案夾。
調用shutil.rmtree(path)将删除path處的檔案夾,它包含的所有檔案和檔案夾都會被删除。
在程式中使用這些函數時,可以在第一次運作程式時,注釋掉這些調用,并且加上print()調用,顯示會被删除的檔案。
<code>import os</code>
<code>for filename in os.listdir():</code>
<code> </code><code>if filename.endswitch('.rxt'):</code>
<code> </code><code>#os.uplink(filename)</code>
<code> </code><code>print(filename)</code>
使用内建的shutil.rmtree()函數不可恢複地删除檔案和檔案夾,是以用起來可能有危險。
删除檔案和檔案夾的更好方法,是使用第三方的send2trash子產品。
它将檔案夾和檔案發送到計算機的垃圾箱或資源回收筒,而不是永久删除它們。
一般來說,總是應該使用send2trash.send2trash()函數來删除檔案和檔案夾。
這種方式,不像永久删除檔案,不會釋放磁盤空間。
send2trash()函數隻能将檔案送到垃圾箱,不能從中恢複檔案。
<code>[root@juispan newdir]</code><code># pip install send2trash</code>
<code>Collecting send2trash</code>
<code> </code><code>Downloading Send2Trash-1.3.0.</code><code>tar</code><code>.gz</code>
<code>Building wheels </code><code>for</code> <code>collected packages: send2trash</code>
<code> </code><code>Running setup.py bdist_wheel </code><code>for</code> <code>send2trash ... </code><code>done</code>
<code> </code><code>Stored </code><code>in</code> <code>directory: </code><code>/root/</code><code>.cache</code><code>/pip/wheels/15/76/b3/a81bb5d0bfc6157d1e5df52d34cbea6ffe8a0fc6fea83bddb0</code>
<code>Successfully built send2trash</code>
<code>Installing collected packages: send2trash</code>
<code>Successfully installed send2trash-1.3.0</code>
<code>>>> </code><code>import</code> <code>send2trash</code>
<code>>>> newFile</code><code>=</code><code>open</code><code>(</code><code>'/tmp/new.txt'</code><code>,</code><code>'a'</code><code>)</code>
<code>>>> newFile.write(</code><code>'Hello World!'</code><code>)</code>
<code>>>> newFile.close()</code>
<code>>>> send2trash.send2trash(</code><code>'/tmp/new.txt'</code><code>)</code>
周遊目錄樹
os.walk()函數被傳入一個字元串值,即一個檔案夾的路徑。
可以在一個for循環語句中使用os.walk()函數,周遊目錄樹,就像使用range()函數周遊一個範圍的數字一樣。
▎不像range(),os.walk()在循環的每次疊代中,傳回3個值:
1、目前檔案夾名稱的字元串。
2、目前檔案夾中子檔案夾的字元串的清單。
3、目前檔案夾中檔案的字元串的清單。
所謂的目前檔案夾,是指for循環目前疊代的檔案夾。程式的目前工作目錄,不會因為os.walk()而改變。
<code>>>> </code><code>import</code> <code>os</code>
<code>>>> </code><code>for</code> <code>dir</code><code>,subdirs,files </code><code>in</code> <code>os.walk(</code><code>'/tmp/'</code><code>):</code>
<code>... </code><code>print</code><code>(</code><code>'dir: '</code><code>+</code><code>dir</code><code>)</code>
<code>... </code><code>for</code> <code>subdir </code><code>in</code> <code>subdirs:</code>
<code>... </code><code>print</code><code>(</code><code>'subdir: '</code><code>+</code><code>subdir)</code>
<code>... </code><code>for</code> <code>file</code> <code>in</code> <code>files:</code>
<code>... </code><code>print</code><code>(</code><code>'file: '</code><code>+</code><code>file</code><code>)</code>
<code>... </code><code>print</code><code>('')</code>
<code>...</code>
<code>dir</code><code>: </code><code>/</code><code>tmp</code><code>/</code>
<code>subdir: .font</code><code>-</code><code>unix</code>
<code>subdir: .X11</code><code>-</code><code>unix</code>
<code>subdir: .ICE</code><code>-</code><code>unix</code>
<code>subdir: .Test</code><code>-</code><code>unix</code>
<code>......</code>
zipfile子產品
将多個檔案打包成一個檔案,這個檔案叫做“歸檔檔案”。
要建立一個ZipFile對象,就調用zipfile.ZipFile()函數,向它傳入一個字元串,表示.zip檔案的檔案名。
zipfile是python子產品的名稱,ZipFile()是函數的名稱。
ZipFile對象有一個namelist()方法,傳回ZIP檔案中包含的所有檔案和檔案夾的字元串的清單。這些字元串可以傳遞給ZipFile對象的getinfo()方法,傳回一個關于特定檔案的ZipInfo對象。ZipInfo對象有自己的屬性,諸如表示位元組數的file_size和compress_size,它們分别表示原來檔案大小和壓縮後檔案大小。ZipFile對象表示整個歸檔檔案,而ZipInfo對象則儲存該歸檔檔案中每個檔案的有用資訊。
<code>>>> </code><code>import</code> <code>zipfile,os</code>
<code>>>> zipFile</code><code>=</code><code>zipfile.ZipFile(</code><code>'/tmp/new.zip'</code><code>)</code>
<code>>>> zipFile.namelist()</code>
<code>[</code><code>'tmp/newdir/1.txt'</code><code>]</code>
<code>>>> zipInfo</code><code>=</code><code>zipFile.getinfo(</code><code>'tmp/newdir/1.txt'</code><code>)</code>
<code>>>> zipInfo.file_size</code>
<code>1100</code>
<code>>>> zipInfo.compress_size</code>
<code>482</code>
<code>>>> zipFile.close()</code>
ZipFile對象的extractall()方法從ZIP檔案中解壓縮所有檔案和檔案夾,放到目前工作目錄中。
如果傳遞給extractall()方法的檔案夾不存在,它會被建立。
extract()方法可以從ZIP檔案中解壓縮單個檔案。
傳遞給extract()的字元串,必須比對namelist()傳回的字元串清單中的一個。
可以向extract()傳遞第二個參數,将檔案解壓縮到指定的檔案夾,而不是目前工作目錄。
如果第二個參數指定的檔案夾不存在,python就會建立它。
extract()的傳回值是被壓縮後檔案的絕對路徑。
<code>>>> </code><code>import</code> <code>os,zipfile</code>
<code>>>> extractZip</code><code>=</code><code>zipfile.ZipFile(</code><code>'/tmp/new.zip'</code><code>)</code>
<code>>>> extractZip.extractall()</code>
<code>>>> extractZip.close()</code>
如果向ZipFile對象的write()方法傳入一個路徑,python就會壓縮該路徑所指的檔案,将它加入ZIP檔案中。
write()方法的第一個參數是一個字元串,代表要添加的檔案名。第二個參數是“壓縮類型”參數,可以總是設定為“zipfile.ZIP_DEFLATED”。
就像寫入檔案一樣,寫模式将擦除ZIP檔案中所有原有的内容。如果需要添加,使用“a”作為第二個參數。
<code>>>> newZip</code><code>=</code><code>zipfile.ZipFile(</code><code>'/tmp/new.zip'</code><code>,</code><code>'w'</code><code>)</code>
<code>>>> newZip.write(</code><code>'/tmp/newdir/1.txt'</code><code>,compress_type</code><code>=</code><code>zipfile.ZIP_DEFLATED)</code>
<code>>>> newZip.close()</code>
<code></code>
本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1950074,如需轉載請自行聯系原作者