- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
9.1 shutil 模块
shutil(或称为shell工具)模块中包含一些函数,让你在Python程序中复制、移动、改名和删除文件。要使用shutil的函数,首先需要import shutil。
9.1.1 复制文件和文件夹
shutil模块提供了一些函数,用于复制文件和整个文件夹。
调用shutil.copy(source, destination),将路径source处的文件复制到路径destination处的文件夹(source和destination都是字符串)。如果destination是一个文件名,它将作为被复制文件的新名字。该函数返回一个字符串,表示被复制文件的路径。
在交互式环境中输入以下代码,看看shutil.copy()的效果:
>>> import shutil, os >>> os.chdir('C:\\') ❶ >>> shutil.copy('C:\\spam.txt', 'C:\\delicious') 'C:\\delicious\\spam.txt' ❷ >>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt') 'C:\\delicious\\eggs2.txt'
第一个shutil.copy()调用将文件C:\spam.txt复制到文件夹C:\delicious。返回值是刚刚被复制的文件的路径。请注意,因为指定了一个文件夹作为目的地❶,原来的文件名spam.txt就被用作新复制的文件名。第二个shutil.copy()调用❷也将文件C:\eggs.txt复制到文件夹C:\delicious,但为新文件提供了一个名字eggs2.txt。
shutil.copy()将复制一个文件,shutil.copytree()将复制整个文件夹,以及它包含的文件夹和文件。调用shutil.copytree(source, destination),将路径source处的文件夹,包括它的所有文件和子文件夹,复制到路径destination处的文件夹。source和destination参数都是字符串。该函数返回一个字符串,是新复制的文件夹的路径。
在交互式环境中输入以下代码:
>>> import shutil, os >>> os.chdir('C:\\') >>> shutil.copytree('C:\\bacon', 'C:\\bacon_backup') 'C:\\bacon_backup'
shutil.copytree()调用创建了一个新文件夹,名为bacon_backup,其中的内容与原来的bacon文件夹一样。现在你已经备份了非常非常宝贵的“bacon”。
9.1.2 文件和文件夹的移动与改名
调用shutil.move(source, destination),将路径source处的文件夹移动到路径destination,并返回新位置的绝对路径的字符串。
如果destination指向一个文件夹,source文件将移动到destination中,并保持原来的文件名。例如,在交互式环境中输入以下代码:
>>> import shutil >>> shutil.move('C:\\bacon.txt', 'C:\\eggs') 'C:\\eggs\\bacon.txt'
假定在C:\目录中已存在一个名为eggs的文件夹,这个shutil.move()调用就是说,“将C:\bacon.txt移动到文件夹C:\eggs中。
如果在C:\eggs中原来已经存在一个文件bacon.txt,它就会被覆写。因为用这种方式很容易不小心覆写文件,所以在使用move()时应该注意。
destination路径也可以指定一个文件名。在下面的例子中,source文件被移动并改名。
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs\\new_bacon.txt') 'C:\\eggs\\new_bacon.txt'
这一行是说,“将C:\bacon.txt移动到文件夹C:\eggs,完成之后,将bacon.txt文件改名为new_bacon.txt。”
前面两个例子都假设在C:\目录下有一个文件夹eggs。但是如果没有eggs文件夹,move()就会将bacon.txt改名,变成名为eggs的文件。
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs') 'C:\\eggs'
这里,move()在C:\目录下找不到名为eggs的文件夹,所以假定destination指的是一个文件,而非文件夹。所以bacon.txt文本文件被改名为eggs(没有.txt文件扩展名的文本文件),但这可能不是你所希望的!这可能是程序中很难发现的缺陷,因为move()调用会很开心地做一些事情,但和你所期望的完全不同。这也是在使用move()时要小心的另一个理由。
最后,构成目的地的文件夹必须已经存在,否则Python会抛出异常。在交互式环境中输入以下代码:
>>> shutil.move('spam.txt', 'c:\\does_not_exist\\eggs\\ham') Traceback (most recent call last): File "C:\Python34\lib\shutil.py", line 521, in move os.rename(src, real_dst) FileNotFoundError: [WinError 3] The system cannot find the path specified: 'spam.txt' -> 'c:\\does_not_exist\\eggs\\ham' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "< pyshell#29>", line 1, in < module> shutil.move('spam.txt', 'c:\\does_not_exist\\eggs\\ham') File "C:\Python34\lib\shutil.py", line 533, in move copy2(src, real_dst) File "C:\Python34\lib\shutil.py", line 244, in copy2 copyfile(src, dst, follow_symlinks=follow_symlinks) File "C:\Python34\lib\shutil.py", line 108, in copyfile with open(dst, 'wb') as fdst: FileNotFoundError: [Errno 2] No such file or directory: 'c:\\does_not_exist\\ eggs\\ham'
Python在does_not_exist目录中寻找eggs和ham。它没有找到不存在的目录,所以不能将spam.txt移动到指定的路径。
9.1.3 永久删除文件和文件夹
利用os模块中的函数,可以删除一个文件或一个空文件夹。但利用shutil模块,可以删除一个文件夹及其所有的内容。
· 用os.unlink(path)将删除path处的文件。
· 调用os.rmdir(path)将删除path处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。
· 调用shutil.rmtree(path)将删除path处的文件夹,它包含的所有文件和文件夹都会被删除。
在程序中使用这些函数时要小心!可以第一次运行程序时,注释掉这些调用,并且加上print()调用,显示会被删除的文件。这样做是一个好主意。下面有一个Python程序,本来打算删除具有.txt扩展名的文件,但有一处录入错误(用粗体突出显示),结果导致它删除了.rxt文件。
import os for filename in os.listdir(): if filename.endswith('.rxt'): os.unlink(filename)
如果你有某些重要的文件以.rxt结尾,它们就会被不小心永久地删除。作为替代,你应该先运行像这样的程序:
import os for filename in os.listdir(): if filename.endswith('.rxt'): #os.unlink(filename) print(filename)
现在os.unlink()调用被注释掉,所以Python会忽略它。作为替代,你会打印出将被删除的文件名。先运行这个版本的程序,你就会知道,你不小心告诉程序要删除.rxt文件,而不是.txt文件。
在确定程序按照你的意图工作后,删除print(filename)代码行,取消os.unlink(filename)代码行的注释。然后再次运行该程序,实际删除这些文件。
9.1.4 用send2trash模块安全地删除
因为Python内建的shutil.rmtree()函数不可恢复地删除文件和文件夹,所以用起来可能有危险。删除文件和文件夹的更好方法,是使用第三方的send2trash模块。你可以在终端窗口中运行pip install send2trash,安装该模块(参见附录A,其中更详细地解释了如何安装第三方模块)。
利用send2trash,比Python常规的删除函数要安全得多,因为它会将文件夹和文件发送到计算机的垃圾箱或回收站,而不是永久删除它们。如果因程序缺陷而用send2trash删除了某些你不想删除的东西,稍后可以从垃圾箱恢复。
安装send2trash后,在交互式环境中输入以下代码:
>>> import send2trash >>> baconFile = open('bacon.txt', 'a') # creates the file >>> baconFile.write('Bacon is not a vegetable.') 25 >>> baconFile.close() >>> send2trash.send2trash('bacon.txt')
一般来说,总是应该使用send2trash.send2trash()函数来删除文件和文件夹。虽然它将文件发送到垃圾箱,让你稍后能够恢复它们,但是这不像永久删除文件,不会释放磁盘空间。如果你希望程序释放磁盘空间,就要用os和shutil来删除文件和文件夹。请注意,send2trash()函数只能将文件送到垃圾箱,不能从中恢复文件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论