概述
本文主要阐述在项目《自动提取pdf指定页》中文件的处理方式。若对项目需求不清楚的用户,请先查看文章《帮你自动化办公的python - 自动提取pdf指定页(项目概述)》。
介绍
python中用于处理文件和目录的模块较多,有os, os.path , shutil 等,本项目主要用到了os和shutil模块,涉及到了文件和目录的一些基本操作,将其抽象成基本类,并根据项目需求,封装了文件处理的一些相关方法。
核心
b_file类中方法基本都是调用现成模块实现,主要包含以下7大功能:
1. 删除文件和目录
#删除文件,file:完整文件名(包含路径) def del_file(self, file): os.remove(file) #删除目录,dir:路径名 def del_dir(self, dir): shutil.rmtree(dir)
2. 获取文件名和路径,以及文件全名拼接
# 获取文件名,file:完整文件名(包含路径) # 返回:名字(不含路径) def get_name(self, file): return os.path.basename(file) # 获取文件路径,file:完整文件名(包含路径) # 返回:路径 def get_path(self, file): return os.path.dirname(file) # 组合文件全名,name:文件名(不含路径) path:路径 # 返回:完整文件名(包含路径) def combination_file(self, path, name): return os.path.join(path, name)
3. 打开和关闭文件
# 以读取的方式打开文件,file:完整文件名(包含路径) # 返回:文件描述符 def open_read(self, file): return open(file, "rb") # 以写入的方式打开文件,file:完整文件名(包含路径) # 返回:文件描述符 def open_write(self, file): return open(file, "wb") # 关闭文件,fd:文件描述符 def close(self, fd): fd.close()
4. 判断是否是文件或目录:
# 判断文件是否是目录,file:完整文件名(包含路径) # 返回:是目录返回True,否则False def is_dir(self, file): return os.path.isdir(file) # 判断文件是否是正常文件,file:完整文件名(包含路径) # 返回:是文件返回True,否则False def is_file(self, file): return os.path.isfile(file)
5. 获取文件后缀
# 获取文件后缀,name:文件名(不含路径) # 返回:文件后缀“.txt"、“.pdf"、".c"等,用来判断文件类型 def get_suffix(self, name): return os.path.splitext(name)[1]
6. 移动文件
#移动文件,src:源 dst:目标 (src和dst为完整文件名,包含路径) def mv_file(self, src, dst): shutil.move(src, dst)
7. 列出目录下所有文件
# 列出目录下所有文件,包括文件夹,path:路径 # 返回:文件列表 def ls_file(self, path): return os.listdir(path)
f_file对象调用b_file的方法,设计出本项目涉及到的文件操作,包含以下3大功能
1. 获取指定目录下所有指定类型文件,注意:这里遍历所有文件用到了递归调用。
# 获取指定目录下所有指定类型文件,path:路径 suffix:后缀 # all_files:用来存储符合指定后缀的文件列表 #返回符合指定后缀的文件列表 def get_type_files(self, path, suffix, all_files): file_list = self.ls_file(path) # 获取当前目录所有文件及文件夹 # 遍历当前目录所有文件及文件夹,文件直接处理,目录则递归调用处理 for name in file_list: file = self.combination_file(path, name) # 获取文件全名 if self.is_dir(file): self.get_type_files(file, suffix, all_files) # 递归处理子目录 else: if self.get_suffix(name) == suffix: # 后缀匹配一致,符合条件 all_files.append(file) return all_files
2. 根据文件名获取页码,文件名前两位数字代表页码
# 获取文件页码,文件名前两位表示页码格式如(02赵明12月工资) # file:完整文件名 返回:-1表示页码不正确、否则页码正常 def get_page(self, file): name = self.get_name(file) num_str = file[0:2] # 取前两位,表示页码 if not num_str.isdigit() or num_str == "" or int(num_str) < 1: return -1 return int(num_str)
3. 获取真实文件名,去掉文件名前面页码之后的名字
# 获取文件名,去掉文件名前两位表示页码后的名字,格式如(赵明12月工资) # file:完整文件名 返回:-1表示页码不正确、否则页码正常 def get_new_file_name(self, file): name = self.get_name(file) new_name = name[2:] # 去掉前两位(页码) return self.combination_file(self.get_path(file), new_name)
示例
★b_file对象(文件基本操作类):
属性:无
行为:包含打开文件、删除文件、关闭文件、打开目录、获取文件路径等。
★f_file对象(本项目中涉及到的文件操作类):
属性:无
行为:包含获取指定目录下所有指定类型文件、通过文件名获取文件页码、获取真实文件名。
f_file.py
import os import shutil # 文件操作基类定义 class b_file(object): def __init__(self, _excel, _name): self.excel = _excel #删除文件,file:完整文件名(包含路径) def del_file(self, file): os.remove(file) #删除目录,dir:路径名 def del_dir(self, dir): shutil.rmtree(dir) #移动文件,src:源 dst:目标 (src和dst为完整文件名,包含路径) def mv_file(self, src, dst): shutil.move(src, dst) # 获取文件名,file:完整文件名(包含路径) 返回:名字(不含路径) def get_name(self, file): return os.path.basename(file) # 获取文件路径,file:完整文件名(包含路径) 返回:路径 def get_path(self, file): return os.path.dirname(file) # 组合文件全名,name:文件名(不含路径) path:路径 返回:完整文件名(包含路径) def combination_file(self, path, name): return os.path.join(path, name) # 获取文件后缀,name:文件名(不含路径) 返回:文件后缀“.txt"、“.pdf"、".c"等,用来判断文件类型 def get_suffix(self, name): return os.path.splitext(name)[1] # 判断文件是否是目录,file:完整文件名(包含路径) 返回:是目录返回True,否则False def is_dir(self, file): return os.path.isdir(file) # 判断文件是否是正常文件,file:完整文件名(包含路径) 返回:是文件返回True,否则False def is_file(self, file): return os.path.isfile(file) # 列出目录下所有文件,包括文件夹,path:路径 返回:文件列表 def ls_file(self, path): return os.listdir(path) # 以读取的方式打开文件,file:完整文件名(包含路径) 返回:文件描述符 def open_read(self, file): return open(file, "rb") # 以写入的方式打开文件,file:完整文件名(包含路径) 返回:文件描述符 def open_write(self, file): return open(file, "wb") # 关闭文件,fd:文件描述符 def close(self, fd): fd.close() # 文件操作类定义 class f_file(b_file): def __init__(self): pass #获取指定目录下所有指定类型文件,path:路径 suffix:后缀 all_files:用来存储符合指定后缀的文件列表 #返回符合指定后缀的文件列表 def get_type_files(self, path, suffix, all_files): file_list = self.ls_file(path) # 获取当前目录所有文件及文件夹 # 遍历当前目录所有文件及文件夹,文件直接处理,目录则递归调用处理 for name in file_list: file = self.combination_file(path, name) # 获取文件全名 if self.is_dir(file): self.get_type_files(file, suffix, all_files) # 递归处理子目录 else: if self.get_suffix(name) == suffix: # 后缀匹配一致,符合条件 all_files.append(file) return all_files # 获取文件页码,文件名前两位表示页码格式如(02赵明(序号83)2019年12月工资发放凭证) # file:完整文件名 返回:-1表示页码不正确、否则页码正常 def get_page(self, file): name = self.get_name(file) num_str = file[0:2] # 取前两位,表示页码 if not num_str.isdigit() or num_str == "" or int(num_str) < 1: return -1 return int(num_str) # 获取文件名,去掉文件名前两位表示页码后的名字,格式如(02赵明(序号83)2019年12月工资发放凭证) # file:完整文件名 返回:-1表示页码不正确、否则页码正常 def get_new_file_name(self, file): name = self.get_name(file) new_name = name[2:] # 去掉前两位(页码) return self.combination_file(self.get_path(file), new_name)
往期 · 推荐
也没想象中那么神秘的数据结构-一种通用化的双向链表设计(底层源码)
关注
更多精彩内容,请关注微信公众号:不只会拍照的程序猿,本人致力分享linux、设计模式、C语言、嵌入式、编程相关知识,也会抽空分享些摄影相关内容,同样也分享大量摄影、编程相关视频和源码,另外你若想要本文章源码请关注公众号:不只会拍照的程序猿,后台回复:PDF拆解源码,也可点击此处下载。