Python 自动化:处理文件目录(笔记)

P

这同样是 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

其实真的平时用起来,估计是大量文件的处理了吧。不过重命名也有批量的工具,压缩也能用压缩软件的批处理,先看看什么时候会用得上这些。

About the author

secangel

双子座 AB 型,资深女校男生

Add comment

About Author

secangel

双子座 AB 型,资深女校男生

Keep In Touch