[Python] 文件扫描
文件扫描

下载
https://github.com/YouXianMing/FileManager
细节
1. 基于Python 3.60,其他版本未测试
2. 支持扫描深度,不设置则扫描全部,设置了值,则扫描具体的层级

源码
import os
import time class FileObject:
"""
文件对象
""" def __init__(self, filePath):
"""
创建FileObject对象
:param filePath: 文件路径
""" self.__tree_file_objects = None
self.__scan_depth = None self.__exists = False
self.__file_path = None
self.__is_file = None
self.__is_dir = None
self._is_link = None
self.__size = None
self.__last_modification_time = None
self.__last_access_time = None
self.__metadata_change_time = None
self.__file_name = None
self.__dir_name = None if os.path.exists(filePath): self.__scan_depth = 0
self.__exists = True
self.__file_path = filePath
self.__is_file = os.path.isfile(filePath)
self.__is_dir = os.path.isdir(filePath)
self._is_link = os.path.islink(filePath)
self.__size = os.path.getsize(filePath)
self.__last_modification_time = os.path.getmtime(filePath)
self.__last_access_time = os.path.getatime(filePath)
self.__metadata_change_time = os.path.getctime(filePath)
self.__file_name = os.path.basename(filePath)
self.__dir_name = os.path.dirname(filePath) if self.__is_dir:
self.__tree_file_objects = [] @property
def scan_depth(self):
"""
扫描深度的设置
:return: 设置的扫描深度
"""
return self.__scan_depth @scan_depth.setter
def scan_depth(self, depth):
self.__scan_depth = depth @property
def tree_file_objects(self):
"""
树形对象结构列表
:return: 数组
"""
return self.__tree_file_objects @tree_file_objects.setter
def tree_file_objects(self, fileList): self.__tree_file_objects = fileList @property
def exists(self):
"""
文件是否存在
:return: 存在返回True,不存在返回False
"""
return self.__exists @property
def file_path(self):
"""
文件路径(初始化成功之后可取)
:return: 初始化成功则有路径,没有初始化成功则没有路径
"""
return self.__file_path @property
def is_file(self):
"""
是否是文件(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,是文件返回True,不是文件返回False
"""
return self.__is_file @property
def is_dir(self):
"""
是否是文件夹(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,是文件夹返回True,不是文件返回False
"""
return self.__is_dir @property
def is_link(self):
"""
是否是link(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,是link返回True,不是文件返回False
"""
return self._is_link @property
def size(self):
"""
文件大小(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,返回文件大小
"""
return self.__size @property
def last_modification_time(self):
"""
最后修改时间(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,返回最后修改时间
"""
return self.__last_modification_time @property
def last_access_time(self):
"""
最后操作时间(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,返回最后操作时间
"""
return self.__last_access_time @property
def metadata_change_time(self):
"""
最后元数据修改时间(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,返回最后元数据修改时间
"""
return self.__metadata_change_time @property
def file_name(self):
"""
文件名(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,返回文件名
"""
return self.__file_name @property
def dir_name(self):
"""
文件夹名(初始化成功之后可取)
:return: 未初始化成功返回None,初始化成功时,返回文件夹名
"""
return self.__dir_name def show_info(self): if self.exists:
string = "[%s]\n" % self.file_name
string += "------------------------------------------\n"
string += "filePath : %s\n" % self.file_path
string += "size : %.2f kb\n" % (self.size / 1024.0)
string += "isDir : %s\n" % self.is_dir
string += "isFile : %s\n" % self.is_file
string += "isLink : %s\n" % self.is_link
string += "lastAccessTime : %s\n" % time.strftime('%Y-%m-%d %H:%M:%S %A',
time.localtime(self.last_access_time))
string += "lastModificationTime : %s\n" % time.strftime('%Y-%m-%d %H:%M:%S %A',
time.localtime(self.last_modification_time))
string += "metadataChangeTime : %s\n" % time.strftime('%Y-%m-%d %H:%M:%S %A',
time.localtime(self.metadata_change_time))
string += "------------------------------------------\n"
print(string) class FileObjectManager:
"""
用来扫描FileObject的类
""" def __init__(self, rootFile): self.rootFile = None if isinstance(rootFile, FileObject):
self.rootFile = rootFile def all_file_objects(self):
"""
获取扫描出来的文件
:return: 扫描文件的数组
""" filesList = [] if self.rootFile:
FileObjectManager.__get_all_files(self.rootFile, filesList) return filesList def scan_with_depth(self, depth=999999):
"""
开始扫描
:param depth: 扫描深度
:return: FileObjectManager对象本身
""" if self.rootFile: # 扫描之前清空rootFile中的数组的数据
self.rootFile.tree_file_objects = []
self.__scan_with_depth(self.rootFile, depth) return self @staticmethod
def __get_all_files(rootFile, filesList):
"""
静态方法:获取所有文件
:param rootFile: FileObject对象,作为rootFile传入
:param filesList: 集合
:return: 无
""" # 判断rootFile是否是File类型
if not isinstance(rootFile, FileObject):
assert False, 'rootFile不是FileObject类型.' if type(filesList) != list:
assert False, 'filesList不是List类型' # 遍历获取所有的文件
for tmpFile in rootFile.tree_file_objects: filesList.append(tmpFile)
if tmpFile.is_dir:
FileObjectManager.__get_all_files(tmpFile, filesList) @staticmethod
def __scan_with_depth(rootFile, depth):
"""
静态方法:递归使用的扫描方法
:param rootFile: 最为rootFile的FileObject对象
:param depth: 扫描深度
:return: 无
""" # 如果扫描等级超过了depth,则不扫描了
if rootFile.scan_depth >= depth:
return # 如果rootFile是文件夹
if rootFile.is_dir: # 获取当前文件夹下的所有子文件
filePathList = os.listdir(rootFile.file_path) # 遍历文件并创建文件夹
for fileName in filePathList: # 创建FileObject对象
file = FileObject(os.path.join(rootFile.file_path, fileName)) # 设置扫描深度
file.scan_depth = rootFile.scan_depth + 1 # 将此文件添加到rootFile的treeFileObjects中
rootFile.tree_file_objects.append(file) # 如果这个文件也是文件夹,则递归调用
if file.is_dir:
FileObjectManager.__scan_with_depth(file, depth)
使用
from file_manager import * # 给定文件夹路径
filesList = FileObjectManager(FileObject("/Users/YouXianMing/Desktop")).scan_with_depth(3).all_file_objects() # 拼接路径数组
filesString = ""
for file in filesList: # 如果是文件,则打印
if file.is_file:
print(file.file_path)
[Python] 文件扫描的更多相关文章
- Linux下Python 文件内容替换脚本
Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...
- 【Python文件处理】递归批处理文件夹子目录内所有txt数据
因为有个需求,需要处理文件夹内所有txt文件,将txt里面的数据筛选,重新存储. 虽然手工可以做,但想到了python一直主张的是自动化测试,就想试着写一个自动化处理数据的程序. 一.分析数据格式 需 ...
- Python文件使用“wb”方式打开,写入内容
Python文件使用"wb"方式打开,写入字符串会报错,因为这种打开方式为:以二进制格式打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. 所以写入 ...
- Python 文件操作函数
这个博客是 Building powerful image classification models using very little data 的前期准备,用于把图片数据按照教程指示放到规定的文 ...
- python文件I/O(转)
Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...
- python 文件操作总结
Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...
- Python基础篇【第2篇】: Python文件操作
Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...
- android媒体文件扫描
项目中可能有这样的需求:下载或导入.导出的图片.音乐等媒体文件,需要马上能在图库或本地视屏播放器中显示出来,或者要能在媒体数据库中查询到媒体文件的相关信息,这时我们就得主动通知系统扫描新的媒体文件了. ...
- python文件和元组
python文件操作 相较于java,Python里的文件操作简单了很多 python 获取当前文件所在的文件夹: os.path.dirname(__file__) 写了一个工具类,用来在当前文件夹 ...
随机推荐
- PYTHON-匿名函数,递归与二分法,面向过程编程-练习
# 四 声明式编程练习题 # 1.将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写names = ['egon', 'alex_sb', ' ...
- Java基础96 ajax技术的使用
本文知识点(目录): 1.ajax的概念 2.使用ajax技术获取服务端的数据_实例 3.使用ajax技术检查用户名是否已存在_实例 4.使用ajax技术验证登录页面的用户名和密码_实例 ...
- Oracle12c 性能优化攻略:攻略1-1:创建具有最优性能的数据库
一:章节前言 本章着眼于影响表中数据存储性能的数据库特性. 表的性能部分取决于在创建之前所应用的数据库特性.例如:在最初创建数据库时采用的物理存储特性以及相关的表空间都会在后来影响表的性能.类似地,表 ...
- vue2进阶之v-model在组件上的使用
v-model 用在 input 元素上时 v-model虽然很像使用了双向数据绑定的 Angular 的 ng-model,但是 Vue 是单项数据流,v-model 只是语法糖而已: <in ...
- LeetCode(41):缺失的第一个正数
Hard! 题目描述: 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输 ...
- 使用@property - 廖雪峰的官方网站
使用@property 阅读: 20616 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9 ...
- MySQL5.6 GTID Replication
MySQL 5.6 的新特性之一,是加入了全局事务 ID (Global Transaction ID) 来强化数据库的主备一致性,故障恢复,以及容错能力.官方文档:http://dev.mysql. ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- RabbitMQ(二):Java 操作队列
1. 简单模式 模型: P:消息的生产者 队列:rabbitmq C:消息的消费者 获取 MQ 连接 public static Connection getConnection() throws I ...
- python全栈开发day17-常用模块collections,random,time,os,sys,序列化(json pickle shelve)
1.昨日内容回顾 1.正则表达式 # 正则表达式 —— str # 检测字符串是否符合要求 # 从大段的文字中找到符合要求的内容 1).元字符 #. # 匹配除换行 ...