Python|OS、shutil实现批量扫描、复制、压缩文件

每天一划水,无事小神仙。

今天有个需求:服务器上有个文件夹,里面按日期生成了文件夹。工作日所在的文件夹内有需要我复制下来的文件。要求每个月取一次。

每月要翻三十个文件夹,找二十多个文件,让我手工复制是绝不可能的!🙂🙂🙂那必须要搞个脚本自己跑。

思路

1、服务器磁盘已映射(本地可直接访问)。

2、确定要批量扫描的文件夹名称(按日期命名的文件夹)。

3、根据要扫描的日期,按文件夹名进行遍历,找到要复制的文件。

4、在桌面创建一个文件夹,把找到的文件复制进去。

5、将复制出来的文件夹进行压缩。

过程

效果截图

要扫描的文件夹,不敢想象让我手工去复制要搞到什么时候~
目标文件夹
代码批量执行还是很快的,输入要执行的区间即可。
执行日志
执行结果完全符合预期😁😁😁
执行结果
然后再自动生成压缩文件~

源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import os
import shutil

# 桌面创建文件夹
def md(tp=None):
if os.path.exists(r'C:\\Users\\admin\\Desktop\\'+tp):
pass
else:
os.makedirs(r'C:\\Users\\admin\\Desktop\\'+tp)
return

# 读取文件夹
def rd(begindate,enddate):
for i in range(int(begindate),int(enddate)+1):
if os.path.exists(r'Z:\\gildata\\FileSync\\Download\\gz\\'+str(i)):
if os.path.exists(r'Z:\\gildata\\FileSync\\Download\\gz\\'+str(i)+'\\PAR_YIELDCURVE_ALL'+str(i)+'.dbf'):
shutil.copy('Z:\\gildata\\FileSync\\Download\\gz\\'+str(i)+'\\PAR_YIELDCURVE_ALL'+str(i)+'.dbf','C:\\Users\\admin\\Desktop\\收益率曲线')
print('{}日的收益率曲线已完成复制'.format(i))
else:
print('无{}日的收益率曲线'.format(i))
else:
print('无{}日的聚源数据文件夹'.format(i))

# 生成压缩包
def zip_dir(dirname,zipfilename):
shutil.make_archive(zipfilename,'zip',root_dir=dirname)

if __name__ == '__main__':
# 输入起止日期
begindate = input('请输入开始日期(格式:20220801):')
enddate = input('请输入结束日期(格式:20220831):')
# 检查文件夹
md("收益率曲线")
# 遍历文件夹
print('#####开始复制{}-{}的收益率曲线#####'.format(begindate,enddate))
rd(begindate,enddate)
# 创建压缩包
print("#####开始创建压缩包#####")
dirname='C:\\Users\\admin\\Desktop\\收益率曲线'
zipfilename='C:\\Users\\admin\\Desktop\\收益率曲线{}-{}'.format(begindate,enddate)
zip_dir(dirname, zipfilename)
print("#####任务执行完成#####")

附:OS库基本用法整理

os是“operating system”的缩写,顾名思义,就是与操作系统相关的标准库。如:文件,目录,执行系统命令等。

工作路径

1
2
3
# 工作路径
print(os.getcwd()) # 返回当前工作目录
os.chdir(r"C:\Users\Administrator\Desktop\test") # 改变当前

工作目录

1
2
3
4
5
6
7
8
9
10
# 工作目录
print(os.listdir()) # 返回当前工作目录下所有文件和文件夹列表
print(os.path.exists('modules')) # 判断文件夹或文件是否存在

# os.walk()
import os
for i, j, k in os.walk(os.getcwd()):
print("path =", i) # 返回当前路径
print("List of directories =", j) # 返回当前路径下的文件夹
print("List of files =", k) # 返回当前路径下的文件列表

文件夹的增删

1
2
3
4
5
6
7
8
9
# 文件夹的增删改
os.mkdir(r'C:\Users\Administrator\Desktop\test\testa') # 创建文件夹,当找不到任何中间目录时,它会引发 FileNotFoundError。
os.makedirs(r'C:\Users\Administrator\Desktop\test\testb') # 创建文件夹,与 mkdir ()不同,它不会引发错误。相反,它创建所有缺少的子目录。
os.removedirs(r'C:\Users\Administrator\Desktop\test\testa') # 删除文件夹,当文件夹不存在时报错。
os.rmdir(r'C:\Users\Administrator\Desktop\test\testb') # 删除现有目录
os.remove('test.txt') # 删除文件
os.unlink('test2.txt') # 删除文件
os.renames(r'C:\Users\a',r'C:\Users\test\b') # 修改目录
os.rename("modules2", "modules3") # 重命名文件夹或文件

运行shell命令

1
os.system('ipconfig') # 运行shell命令

获取文件大小

1
print(os.path.getsize('main.py')) # 获取文件大小,字节

打开到命令的管道或从命令打开管道

1
2
3
4
5
6
7
# 打开到命令的管道或从命令打开管道
file_name=r'python C:\Users\Administrator\Desktop\test\a.py'
file = os.popen(file_name,'w')
file.writelines('print("hello world2!!!"')
file = os.popen(file_name,'r')
print(file.read())
file.close() # 关闭由 popen ()或 tube ()打开的文件

参考文档

Python OS Module - Python Geeks

附:shutil库基本用法整理

shutil 是 python 中的高级文件操作模块,与 os 模块形成互补的关系,os 主要提供了文件或文件夹的新建、删除、查看等方法,还提供了对文件以及目录的路径操作。shutil 模块提供了移动、复制、 压缩、解压等操作,恰好与 os 互补,os 和 shutil 一起使用,基本能完成所有文件的操作。是一个非常重要的模块。

复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 复制文件
shutil.copy(r"C:\Users\Administrator\Desktop\case.txt",r"C:\Users\Administrator\Desktop\case")

# 将一个文件的内容复制到另一个文件中
shutil.copyfile(r"C:\Users\Administrator\Desktop\case.txt",r"C:\Users\Administrator\Desktop\case\case3.txt")

'''
shutil.copytree() 描述:复制整个目录及文件,不需要的文件类型可以不复制
语法:shutil.copytree(oripath, despath, ignore= shutil.ignore_patterns("*.xls", "*.doc"))
参数:
oripath : "来源路径"
despath : "目标路径"
ignore : shutil.ignore_patterns() 是对内容进行忽略筛选,将对应的内容进行忽略。
'''
path1 = r'C:\Users\Administrator\Desktop\case'
path2 = r'C:\Users\Administrator\Desktop\case1\copytree'
shutil.copytree(path1,path2,ignore=shutil.ignore_patterns('case.txt','*.DOC')) # case.txt和doc文件忽略

移动

1
2
# 移动文件
shutil.move(r"C:\Users\Administrator\Desktop\case.txt",r"C:\Users\Administrator\Desktop\case")

递归删除

1
2
# 递归删除文件及文件夹
shutil.rmtree(r"C:\Users\Administrator\Desktop\unpack")

查看磁盘信息

1
2
# 查看磁盘信息
print(shutil.disk_usage('d:'))

压缩与解压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'''
shutil.make_archive 描述:压缩打包
语法:make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None)
压缩打包
base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径
format: 压缩或者打包格式 "zip", "tar", "bztar"or "gztar"
root_dir : 将哪个目录或者文件打包(也就是源文件)
'''
shutil.make_archive(r"C:\Users\Administrator\Desktop\a",'zip',root_dir=r"C:\Users\Administrator\Desktop\case")

'''
shutil.unpack_archive 描述: 获取支持的压缩文件格式。目前支持的有:tar、zip、gztar、bztar。在Python3还多支持一种格式xztar
语法:unpack_archive(filename, extract_dir=None, format=None)
filename:文件路径
extract_dir:解压至的文件夹路径。文件夹可以不存在,会自动生成
format:解压格式,默认为None,会根据扩展名自动选择解压格式
'''
shutil.unpack_archive(r"C:\Users\Administrator\Desktop\a.zip",r"C:\Users\Administrator\Desktop\unpack")

参考文档

shutil — 高阶文件操作 — Python 3.10.7 文档


商业转载请联系作者获得授权,非商业转载请注明出处。

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

Python|OS、shutil实现批量扫描、复制、压缩文件
http://hncd1024.github.io/2022/08/15/Python os 批量复制文件/
作者
CHEN DI
发布于
2022-08-15
许可协议