天天看点

组织文件

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,如需转载请自行联系原作者