[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+selenium三:鼠标事件与键盘事件
1.鼠标事件:# 每个模拟事件后需加.perform() 才会执行# context_click() 右击# double_click() 双击# drag_and_drop(source, targ ...
- hdu 1879 有的边已存在 (MST)
Sample Input31 2 1 0 //u v w 是否已建 1 3 2 02 3 4 031 2 1 01 3 2 02 3 4 131 2 1 01 3 2 12 3 4 10 Sample ...
- #6【bzoj4321】queue2 dp
题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行: 现在想知道,存在多少方案满足沙茶们如此不苛刻的条件. ...
- tomcat启动慢解决方案
一.环境 centos6.7 tomcat8 jdk1.8 二.现象 启动tomcat会花费10多分钟,正常情况下几秒就可以了. 三.解决办法 度娘了一下是因为jdk在生成随机数上耗时,找到j ...
- Codeforces Round #319 (Div. 2) D - Invariance of Tree
Invariance of Tree 题目大意:给你一个有1-n组成的序列p,让你构造一棵树,如果节点a和b之间有一条边,则p[a]和p[b]之间也有一条边. 思路:没啥思路,看了题解菜爆. 我们可以 ...
- Codeforces Round #369 (Div. 2)-C Coloring Trees
题目大意:有n个点,由m种颜料,有些点没有涂色,有些点已经涂色了,告诉你每个点涂m种颜色的价格分别是多少, 让你求将这n个点分成k段最少需要多少钱. 思路:动态规划,我们另dp[ i ][ j ][ ...
- PyCharm 和 IntelliJ IDEA的破解激活
本教程对jetbrains全系列可用,例如:IDEA.WebStorm.phpstorm.clion等 PyCharm激活: 方法一: server选项里边输入 http://elporfirio. ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-6 Cornell box
Chapter 6:Rectangles and Lights 今天,我们来学习长方形区域光照 先看效果 light 首先我们需要设计一个发光的材质 /// light.hpp // ------- ...
- Java设计模式从精通到入门三 策略模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: 以周瑜赔了夫人又折兵的例 ...
- HTTP那些事儿
一.HTTP和HTTPSHTTP协议通常承载于TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS.HTTP是超文本传输协议,信息是明文传输 ...