天天看點

組織檔案

shutil子產品

shutil子產品中包含一些函數,提供複制、移動、改名和删除檔案的功能。要使用shutil的函數,首先需要import shutil。

調用shutil.copy(source,destination),将路徑source處的檔案複制到路徑destination處的檔案夾(source和destination都是字元串)。如果destination是一個檔案名,它将作為被複制檔案的新名字。該函數傳回一個字元串,表示被複制檔案的路徑。

shutil.copy()将複制一個檔案,shutil.copytree()将複制整個檔案夾,以及它包含的檔案夾和檔案。shutil.copytree()函數傳回一個字元串,是新複制的檔案夾的路徑。

<code>&gt;&gt;&gt; </code><code>import</code> <code>shutil,os</code>

<code>&gt;&gt;&gt; os.chdir(</code><code>'/tmp/'</code><code>)</code>

<code>&gt;&gt;&gt; shutil.copy(</code><code>'./1.txt'</code><code>,</code><code>'/tmp/newdir/'</code><code>)</code>

<code>'/tmp/newdir/1.txt'</code>

<code>&gt;&gt;&gt; shutil.copy(</code><code>'./1.txt'</code><code>,</code><code>'/tmp/newdir/2.txt'</code><code>)</code>

<code>'/tmp/newdir/2.txt'</code>

<code>&gt;&gt;&gt; </code><code>import</code> <code>os,shutil</code>

<code>&gt;&gt;&gt; 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>&gt;&gt;&gt; </code><code>import</code> <code>shutil</code>

<code>&gt;&gt;&gt; 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>&gt;&gt;&gt; </code><code>import</code> <code>send2trash</code>

<code>&gt;&gt;&gt; newFile</code><code>=</code><code>open</code><code>(</code><code>'/tmp/new.txt'</code><code>,</code><code>'a'</code><code>)</code>

<code>&gt;&gt;&gt; newFile.write(</code><code>'Hello World!'</code><code>)</code>

<code>&gt;&gt;&gt; newFile.close()</code>

<code>&gt;&gt;&gt; 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>&gt;&gt;&gt; </code><code>import</code> <code>os</code>

<code>&gt;&gt;&gt; </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>&gt;&gt;&gt; </code><code>import</code> <code>zipfile,os</code>

<code>&gt;&gt;&gt; zipFile</code><code>=</code><code>zipfile.ZipFile(</code><code>'/tmp/new.zip'</code><code>)</code>

<code>&gt;&gt;&gt; zipFile.namelist()</code>

<code>[</code><code>'tmp/newdir/1.txt'</code><code>]</code>

<code>&gt;&gt;&gt; zipInfo</code><code>=</code><code>zipFile.getinfo(</code><code>'tmp/newdir/1.txt'</code><code>)</code>

<code>&gt;&gt;&gt; zipInfo.file_size</code>

<code>1100</code>

<code>&gt;&gt;&gt; zipInfo.compress_size</code>

<code>482</code>

<code>&gt;&gt;&gt; zipFile.close()</code>

ZipFile對象的extractall()方法從ZIP檔案中解壓縮所有檔案和檔案夾,放到目前工作目錄中。

如果傳遞給extractall()方法的檔案夾不存在,它會被建立。

extract()方法可以從ZIP檔案中解壓縮單個檔案。

傳遞給extract()的字元串,必須比對namelist()傳回的字元串清單中的一個。

可以向extract()傳遞第二個參數,将檔案解壓縮到指定的檔案夾,而不是目前工作目錄。

如果第二個參數指定的檔案夾不存在,python就會建立它。

extract()的傳回值是被壓縮後檔案的絕對路徑。

<code>&gt;&gt;&gt; </code><code>import</code> <code>os,zipfile</code>

<code>&gt;&gt;&gt; extractZip</code><code>=</code><code>zipfile.ZipFile(</code><code>'/tmp/new.zip'</code><code>)</code>

<code>&gt;&gt;&gt; extractZip.extractall()</code>

<code>&gt;&gt;&gt; extractZip.close()</code>

如果向ZipFile對象的write()方法傳入一個路徑,python就會壓縮該路徑所指的檔案,将它加入ZIP檔案中。

write()方法的第一個參數是一個字元串,代表要添加的檔案名。第二個參數是“壓縮類型”參數,可以總是設定為“zipfile.ZIP_DEFLATED”。

就像寫入檔案一樣,寫模式将擦除ZIP檔案中所有原有的内容。如果需要添加,使用“a”作為第二個參數。

<code>&gt;&gt;&gt; newZip</code><code>=</code><code>zipfile.ZipFile(</code><code>'/tmp/new.zip'</code><code>,</code><code>'w'</code><code>)</code>

<code>&gt;&gt;&gt; newZip.write(</code><code>'/tmp/newdir/1.txt'</code><code>,compress_type</code><code>=</code><code>zipfile.ZIP_DEFLATED)</code>

<code>&gt;&gt;&gt; newZip.close()</code>

<code></code>

本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1950074,如需轉載請自行聯系原作者