一、shutil模块
shutil(或称为shell工具)模块中包含一些函数,让你可以在Python程序中复制、移动、重命名和删除文件。
1、复制文件和文件夹
source | destination | destination存在 | destination不存在 |
文件 | 文件 | 将 source 文件复制并覆盖 destination 文件 | 复制 source 文件并重命名为 destination |
文件 | 目录 | 将 source 文件复制到 destination 目录中 | 会抛出错误(因为目标目录不存在) |
目录 | 文件 | 无此情况 | 无此情况 |
shutil.copytree(source, destination) | |||
目录 | 目录 | 报错(destination 目录必须为不存在的新目录) | 复制整个 source 目录及其内容到 destination ,并创建 destination 目录 |
shutil.copytree(r"E:\test", Path.cwd()/"newText")
shutil.copy(r"E:\test.txt", Path.cwd()/"newText.txt")
2、 文件和文件夹的移动与重命名
source | destination | destination存在 | destination不存在 |
文件 | 文件 | 将 source 文件移动并覆盖 destination 文件 | 将 source 文件重命名为 destination 并移动到目标位置 |
文件 | 目录 | 将 source 文件移动到 destination 目录中 |
|
目录 | 文件 | 无此情况 | 无此情况 |
目录 | 目录 | 将 source 目录及其内容移动到 destination 目录中 | 将 source 目录及其内容重命名为 destination 并移动到目标路径 |
3、永久删除文件和文件夹
利用os
模块中的函数,可以删除一个文件或一个空文件夹。利用shutil
模块,可以删除一个文件夹及其所有的内容。
- 调用
os.unlink(path)
将删除path
处的文件。- 调用
os.rmdir(path)
将删除path
处的文件夹。该文件夹必须为空,其中不能有任何文件和文件夹。- 调用
shutil.rmtree(path)
将删除path
处的文件夹,它包含的所有文件和文件夹都会被删除。
小tips:为了防止误删文件,可以在第一次运行程序时注释掉这些调用,并且加上print()
调用,显示会被删除的文件。
from pathlib import Path
for filename in Path.home().glob('*.rxt'):
#os.unlink(filename)
print(filename)
4、用send2trash模块安全地删除
send2trash
会将文件夹和文件发送到计算机的回收站,而不是永久删除它们。
使用send2trash.send2trash(路径)函数来删除文件和文件夹。
二、遍历目录树
使用os.walk()函数,该函数被传入一个字符串值,即一个文件夹的路径。可以在一个for
循环语句中使用os.walk()
函数遍历目录树,os.walk()
在循环的每次迭代中返回以下3个值:
- 当前文件夹名称的字符串,是绝对路径。
- 当前文件夹中子文件夹的字符串的列表。
- 当前文件夹中文件的字符串的列表。
遍历文件夹顺序是从上往下
import os
for folderName, subfolders, filenames in os.walk('C:\\delicious'):
print('The current folder is ' + folderName)
for subfolder in subfolders:
print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
for filename in filenames:
print('FILE INSIDE ' + folderName + ': '+ filename)
print('')
三、 用zipfile模块压缩文件
在ZipFile对象中完成
1、读取ZIP文件
调用zipfile.ZipFile()
函数创建ZipFile对象,向它传入一个字符串,表示ZIP文件的文件名。
namelist() | 返回ZIP文件中包含的所有文件和文件夹的字符串的列表 |
getinfo() | 返回一个关于特定文件的ZipInfo 对象,传入字符串必须匹配namelist() 返回的字符串列表中的一个 |
ZipInfo 对象属性 | |
file_size | 原来文件大小 |
compress_size | 压缩后文件大小 |
import zipfile
exampleZip = zipfile.ZipFile(r'E:\example.zip')
print(exampleZip.namelist())
catsInfo = exampleZip.getinfo("example/cats/catnames.txt")
print(catsInfo.file_size)
print(catsInfo.compress_size)
>> ['example/', 'example/cats/', 'example/cats/catnames.txt', 'example/cats/zophie.jpg', 'example/spam.txt']
>> 260
>> 198
2、从ZIP文件中解压缩
extractall() |
|
extract() | 从ZIP文件中解压缩单个文件或目录。
|
3、创建和添加到ZIP文件
1)创建
以"w"模式打开ZipFile
对象,使用write()方法压缩,该方法有两个参数:
- 参数1:指定需要压缩文件的路径
- 参数2:指定压缩算法,常用zipfile.ZIP_DEFLATED
注意,write()方法在处理文件夹路径时只会创建一个空的文件夹条目,并不会自动递归地压缩文件夹内的所有内容。
2)添加
"a"模式打开ZipFile
对象
exampleZip = zipfile.ZipFile(r'open.zip',"w")
print(exampleZip.namelist())
exampleZip.write(r"E:\example\spam.txt",compress_type=zipfile.ZIP_DEFLATED)
exampleZip.close()
如果想将一个目录中所有内容全部压缩,用os.walk()来遍历文件夹结构并手动添加每个文件:
with zipfile.ZipFile('new.zip', 'w') as newZip:
for foldername, subfolders, filenames in os.walk(r"E:\example"):
for filename in filenames:
file_path = os.path.join(foldername, filename)
newZip.write(file_path, compress_type=zipfile.ZIP_DEFLATED)