Python中文件和文件夹的复制、移动、重命名、删除
shutil模块是一个shell集成工具,其中包含了可以用于文件复制、移动、重命名和删除的功能。
复制文件和文件夹
shutil.copy(source, destination)
复制文件
调用shutil.copy(source, destination)
,将source
处的文件复制到destination
处。
source
指向文件名称,destination
如果是个文件夹名,就把source处的文件复制到该文件夹,destination
如果是个文件名, 这个名称就会作为被复制文件的新名称。目标文件夹不存在会报错。
返回值是复制后的文件路径。
>>> import shutil
>>> from pathlib import Path
# 把a.txt复制到一个文件夹
>>> shutil.copy(Path.cwd() / 'a.txt', Path.cwd() / 'folderB')
'C:\\Users\\yx\\Desktop\\folderA\\folderB\\a.txt'
# 把a.txt复制到新文件夹并给定一个新名字
>>> shutil.copy(Path.cwd() / 'a.txt', Path.cwd() / 'folderB/copyed_a.txt')
WindowsPath('C:/Users/yx/Desktop/folderA/folderB/copyed_a.txt')
# 如果destination路径不存在,就会报错(FileNotFoundError)
>>> shutil.copy(Path.cwd() / 'a.txt', Path.cwd() / 'folderC/folderD')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\yx\AppData\Roaming\uv\python\cpython-3.11.13-windows-x86_64-none\Lib\shutil.py", line 431, in copy
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "C:\Users\yx\AppData\Roaming\uv\python\cpython-3.11.13-windows-x86_64-none\Lib\shutil.py", line 258, in copyfile
with open(dst, 'wb') as fdst:
^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\yx\\Desktop\\folderA\\folderC\\folderD'
shutil.copytree(source, destination)
复制文件夹及子目录的所有内容
目标文件夹不存在会自动创建。
返回值是复制后的文件路径。
>>> shutil.copytree(Path.cwd() / 'folderB', Path.cwd() / 'folderB_backup')
WindowsPath('C:/Users/yx/Desktop/folderA/folderB_backup')
移动、重命名文件和文件夹
shutil.move(source, destination)
函数可以把source
处的文件夹移动到destination
。
如果
destination
是一个文件夹,就把source
文件移动到这个文件夹;当然,如果destination
处有重名的,就会覆盖。如果
destination
是一个文件名,source
文件就会被移动并重命名。如果
destination
是一个不存在的文件夹,source
文件会被重命名为这个文件夹的名字,并且没有扩展名,这需要注意。同样的情况在shutil.copy()
也存在。最后一个
/
前的各级目录必需都存在,否则会报错(FileNotFoundError
)返回值是新位置的路径。
# destination是文件夹
>>> shutil.move(Path.cwd() / 'folderB/a.txt', Path.cwd() / 'folderC')
'C:\\Users\\yx\\Desktop\\folderA\\folderC\\a.txt'
# destination是文件名
>>> shutil.move(Path.cwd() / 'folderB/b.txt', Path.cwd() / 'folderC/new_b.txt')
WindowsPath('C:/Users/yx/Desktop/folderA/folderC/new_b.txt')
# destination是不存在的文件夹
>>> shutil.move(Path.cwd() / 'folderB/c.txt', Path.cwd() / 'folderC/folderD')
WindowsPath('C:/Users/yx/Desktop/folderA/folderC/folderD')
永久地删除文件和文件夹
os.unlink(path)
,path
是文件名,删除path
指向的文件;os.rmdir(path)
,path
是文件夹名,删除path
处的文件夹,该文件夹必需为空;shutil.rmtree(path)
,删除path
处的文件夹及其内部所有的文件和子文件夹。以上的删除是永久删除,保险起见,先
print()
检查一下,再添加删除代码为宜。
>>> os.unlink(Path.cwd() / 'folderB/copyed_a.txt') # 文件copyed_a.txt被永久删除
>>> os.rmdir(Path.cwd() / 'folderB') # 空文件夹folderB被删除
>>> shutil.rmtree(Path.cwd() / 'folderB_backup') # 文件夹folderB_backup及其所有内容都被删除
安全地删除文件和文件夹
上面的函数是永久删除,不可恢复。使用第三方的send2trash模块,可以将被删除的文件和文件夹送至回收站。
这是第三方模块,使用前记得先安装。
>>> import send2trash
>>> testFile = open('testFile.txt','w',encoding='utf8')
>>> testFile.write("this is a test file, it will be deleted soon")
44
>>> testFile.close()
>>> send2trash.send2trash('testFile.txt') # 文件被移动到回收站
>>> shutil.copytree('folderC', 'copyed_folderC')
'copyed_folderC'
>>> send2trash.send2trash('copyed_folderC') # 文件夹被移动到回收站
- 感谢你赐予我前进的力量