[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__) 写了一个工具类,用来在当前文件夹 ...
随机推荐
- 【docker】资料
https://yeasy.gitbooks.io/docker_practice/content/network/linking.html
- python 全栈开发,Day53(jQuery的介绍,jQuery的选择器,jQuery动画效果)
js总结 js: 1.ECMAScript5 ES5语法 2.DOM CRUD 获取 3种方式 id tag className //面向对象 对象 : 属性和方法 某个对象中 function $( ...
- Nginx 响应状态
ngx.status = ngx.HTTP_CONTINUE (100) (first added in the v0.9.20 release)ngx.status = ngx.HTTP_SWITC ...
- BZOJ1477 青蛙的约会 扩展欧几里德
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1477 题意概括 两只青蛙,现在分别在x,y的位置,以m,n的速度在周长为L的环形跑道上面跑. 问他 ...
- 【Java】 剑指offer(46) 把数字翻译成字符串
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成" ...
- 066 linux下时间的修改
1.关于时间的修改,在linux还是很重要的,在这里只是介绍一个简单的常用的命令,并且时间不会写入到系统. 2.命令 3.如果想把时间写进系统 修改完成之后,输入clock -w 时间将会被写进CMO ...
- Mybatis insert时返回自增id
SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式. 详细看这里:http://www.cnblogs.com/SimonHu1 ...
- 写一个java死锁的demo
package com.simon.study; /** * 线程死锁 一个线程要同时拥有两个对象的资源才能进行下一步操作: * @author: Simon * @date: 2017年7月29日 ...
- BeanUtils进行日期格式的拷贝转换
自定义Converter的方法: import java.text.ParseException; import java.text.SimpleDateFormat; import org.apac ...
- 三篇文章带你极速入门php(二)之迅速搭建php环境
前言 今天讲一下php在windows,mac,linux上的集成环境搭建,目标是简单快速,环境这个事得对号入座,windows用phpstudy,mac用mamp,linux用lnmp一键安装,直接 ...