'init'
This commit is contained in:
commit
44a29f8a48
162
main.py
Normal file
162
main.py
Normal file
@ -0,0 +1,162 @@
|
||||
# coding:utf-8
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
from multiprocessing import Pool
|
||||
|
||||
from sqlalchemy import Column, String, create_engine, table, Text, MetaData, Table, Integer, TIMESTAMP
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.dialects.mysql import Insert
|
||||
|
||||
|
||||
class UpdateInsert:
|
||||
def __init__(self):
|
||||
self.engine = None
|
||||
self.session = None
|
||||
|
||||
def __enter__(self):
|
||||
self.engine = create_engine('mysql+pymysql://root:87251326@10.0.0.5:3306/file_monitor?charset=utf8')
|
||||
self.session = sessionmaker(bind=self.engine)()
|
||||
metadata = MetaData(self.engine)
|
||||
self.json_file_model = Table('json_file', metadata,
|
||||
Column('id', Integer, primary_key=True),
|
||||
Column('project', String(32)),
|
||||
Column('path', String(255)),
|
||||
Column('ctime', Integer),
|
||||
Column('atime', Integer),
|
||||
Column('mtime', Integer),
|
||||
)
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||
self.session.commit()
|
||||
self.session.close()
|
||||
|
||||
def on_duplicate_key_update(self, *data):
|
||||
for item in data:
|
||||
insert_stmt = Insert(self.json_file_model).values(item)
|
||||
on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update(item)
|
||||
self.session.execute(on_duplicate_key_stmt)
|
||||
self.session.commit()
|
||||
|
||||
|
||||
class FileMonitor:
|
||||
def __init__(self, root_path):
|
||||
self.json_files = set()
|
||||
self.root_path = root_path
|
||||
self.skeleton_json_files = set()
|
||||
self.file_count = 0
|
||||
|
||||
def get_all_file(self, path):
|
||||
"""
|
||||
取所有json文件
|
||||
:param path:
|
||||
:return:
|
||||
"""
|
||||
if '.svn' in path:
|
||||
return
|
||||
all_files = os.listdir(path)
|
||||
for file in all_files:
|
||||
filepath = os.path.join(path, file)
|
||||
print(filepath)
|
||||
self.file_count += 1
|
||||
if os.path.isdir(filepath):
|
||||
self.get_all_file(filepath)
|
||||
if filepath.endswith('.json'):
|
||||
self.json_files.add(filepath)
|
||||
|
||||
def check_json(self):
|
||||
"""
|
||||
取满足要求的json文件
|
||||
:return:
|
||||
"""
|
||||
for path in self.json_files:
|
||||
try:
|
||||
print(f'检查 {path}')
|
||||
with open(path, encoding='utf8') as f:
|
||||
try:
|
||||
data = json.load(f)
|
||||
except:
|
||||
continue
|
||||
if isinstance(data, dict) and "skeleton" in data and "spine" in data['skeleton']:
|
||||
self.skeleton_json_files.add(path)
|
||||
except:
|
||||
pass
|
||||
|
||||
def get_project_name(self, path):
|
||||
"""
|
||||
获取项目名
|
||||
:param path:
|
||||
:return:
|
||||
"""
|
||||
file_path = ''
|
||||
project_name = ''
|
||||
for item in path.split(self.root_path):
|
||||
if not item:
|
||||
continue
|
||||
file_path = item
|
||||
for p in item.split('\\'):
|
||||
if not p:
|
||||
continue
|
||||
project_name = p
|
||||
break
|
||||
break
|
||||
|
||||
return file_path, project_name
|
||||
|
||||
def get_data(self):
|
||||
"""
|
||||
格式化数据
|
||||
:return:
|
||||
"""
|
||||
data = []
|
||||
for path in self.skeleton_json_files:
|
||||
ctime = int(os.path.getctime(path))
|
||||
atime = int(os.path.getatime(path))
|
||||
mtime = int(os.path.getmtime(path))
|
||||
file_path, project_name = self.get_project_name(path)
|
||||
data.append({
|
||||
'ctime': ctime,
|
||||
'atime': atime,
|
||||
'mtime': mtime,
|
||||
'project': project_name,
|
||||
'path': file_path
|
||||
})
|
||||
print(ctime, atime, mtime, project_name, file_path)
|
||||
return data
|
||||
|
||||
def update_save(self, data):
|
||||
"""
|
||||
更新插入
|
||||
:return:
|
||||
"""
|
||||
with UpdateInsert() as obj:
|
||||
obj.on_duplicate_key_update(*data)
|
||||
|
||||
def run(self, path):
|
||||
self.get_all_file(path)
|
||||
self.check_json()
|
||||
data = self.get_data()
|
||||
self.update_save(data)
|
||||
print(f'遍历文件数 {self.file_count}')
|
||||
|
||||
|
||||
def handler(args):
|
||||
obj = FileMonitor(args[0])
|
||||
obj.run(args[1])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
st = int(time.time())
|
||||
print(st)
|
||||
root_dir = os.path.abspath(os.path.dirname(__file__))
|
||||
print(root_dir)
|
||||
files = os.listdir(root_dir)
|
||||
dir_list = [(root_dir, os.path.join(root_dir, item)) for item in files if
|
||||
os.path.isdir(os.path.join(root_dir, item))]
|
||||
print(f'开启进程数 {len(dir_list)}')
|
||||
time.sleep(3)
|
||||
|
||||
with Pool(len(dir_list)) as p:
|
||||
p.map(handler, dir_list)
|
||||
print(f'用时 {int(time.time()) - st}')
|
Loading…
Reference in New Issue
Block a user