这同样是 Automate The Boring Stuff With Python 上面关于文件管理的内容。
管理文件需要用到的库是 shutil 和 os, 而需要处理文件夹的时候就需要从 shutil 当中导入 Path:
import shutil, os from pathlib import Path p = Path.home() # home 文件夹为用户文件夹,例如 C:\Users\Chris
复制文件
shutil.copy(p /'06Hf30Q.png', p /'test.png') # 指明源文件和目标文件的名称 shutil.copy(p /'06Hf30Q.png', p /'Desktop') # 如果目标为已经存在的文件夹名称,则会复制到该文件夹,保留本来的文件名 shutil.copy(p /'06Hf30Q.png', p /'Desktop/test.png') # 如果目标为已经存在的文件夹名称,也可以指定文件名 shutil.copy(p /'06Hf30Q.png', p /'No_This_Folder') # 如果目标为不存在的文件夹或文件名称,则会复制到本来的文件夹,用不存在的文件名称
复制文件夹
shutil.copytree(p /'vmlogs', p /'test')
移动文件或文件夹
# shutil.move 不能用上面的 Path.home(), 只能绝对路径 shutil.move('C:\\Users\\Chris\\New.txt', 'C:\\Users\\Chris\\vmlogs') # 指明源文件和目标文件夹的名称 shutil.move('C:\\Users\\Chris\\New.txt', 'C:\\Users\\Chris\\apple\\Old.txt') # 指明源文件、目标文件夹和目标文件的名称;如果目标文件夹不存在,不会新建
删除文件或文件夹
os.unlink(path) # 删除一个文件 os.rmdir(path) # 删除一个空目录;如果不是空目录就不能删除 shutil.rmtree(path) # 删除一个文件或者文件夹;文件夹里面所有东西都会被删除 # 删除前可以用 print 来再次检查要删除的东西: for filename in Path.home().glob('*.rxt'): # os.unlink(filename) # 真的删除文件 print(filename) # 显示本来会删除的文件 import send2trash send2trash.send2trash(path) # 直接把文件放到回收站
遍历文件夹以及里面的文件
for folderName, subfolders, filenames in os.walk('C:\\Users\\Chris\\Desktop\\songs extracted'): # 开始一个循环,在指定的目录/文件夹内遍历每个文件夹、子文件夹和文件 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('')
读取 zip 文件
import zipfile, os from pathlib import Path p = Path.home() # 指定一个目录 exampleZip = zipfile.ZipFile(p / 'example.zip') # 把目录下面的 example.zip 文件放在 exampleZip 变量当中 print(exampleZip.namelist()) # 显示 exampleZip 里面的文件名 spamInfo = exampleZip.getinfo('spam.txt') # 把 exampleZip 当中的文件 spam.txt 的信息放在 spamInfo 变量当中 print(spamInfo.file_size) # 显示 spamInfo 当中本来的文件大小 print(spamInfo.compress_size) # 显示 spamInfo 当中压缩后的文件大小 print(f'Compressed file is {round(spamInfo.file_size / spamInfo.compress_size, 2)}x smaller!') # 显示文件缩小的倍数 exampleZip.close() # 关闭 exampleZip
从 zip 文件解压
import zipfile, os from pathlib import Path p = Path.home() # 指定一个目录 exampleZip = zipfile.ZipFile(p / 'example.zip') # 把目录下面的 example.zip 文件放在 exampleZip 变量当中 exampleZip.extract('spam.txt') # 解压缩 spam.txt 文件,默认到 C:\ 根目录下面 exampleZip.extract('spam.txt', 'C:\\some\\new\\folders') # 解压缩 spam.txt 文件,到指定的文件夹 exampleZip.extractall() # 解压缩所有文件,默认到 C:\ 根目录下面 exampleZip.close() # 关闭 exampleZip
创建 zip 文件,向 zip 文件加入文件
import zipfile newZip = zipfile.ZipFile('new.zip', 'w') # 新建一个 zip 文件,放在变量 newZip 当中,名为 new.zip; w 为写入模式,会清除已经有的文件/内容 newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED) # 把 spam.txt 写入这个 newZip 当中并指定压缩模式 newZip.close() # 关闭 newZip newZip2 = zipfile.ZipFile('new.zip', 'a') # 打开 new.zip 文件,放到变量 newZip2 当中,a 为追加模式,不会清除已经有的文件/内容 newZip2.write('spam2.txt', compress_type=zipfile.ZIP_DEFLATED) # 把 spam2.txt 写入到这个 newZip2 当中并指定压缩模式 newZip2.close() # 关闭 newZip2
其实真的平时用起来,估计是大量文件的处理了吧。不过重命名也有批量的工具,压缩也能用压缩软件的批处理,先看看什么时候会用得上这些。