134 lines
4.4 KiB
Python
134 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
||
import jinja2
|
||
import datetime
|
||
import subprocess
|
||
import random
|
||
import shutil
|
||
|
||
from pathlib import Path
|
||
from faker import Faker
|
||
from chinese_calendar import is_workday
|
||
|
||
|
||
NOW = Path(__file__).parent
|
||
ETC = NOW.parent / "etc"
|
||
OUTPUT = NOW.parent / "output"
|
||
|
||
|
||
def faker_datas(number=7):
|
||
"""
|
||
生成日志模板所需要的内容,一天一个默认7天,排除掉工作日(排除掉的也算一天)
|
||
"""
|
||
f = Faker(locale="zh_CN")
|
||
# 用来存所有的
|
||
datas = []
|
||
# 现在的时间
|
||
today = datetime.datetime.now().date()
|
||
# 默认生成前7天的数据
|
||
for n in range(0, number):
|
||
# 前N天
|
||
date = today + datetime.timedelta(days=-n)
|
||
# 判断是不是工作日
|
||
if not is_workday(date):
|
||
continue
|
||
# 用来保存1天所需要的内容
|
||
diary_log = {}
|
||
# 创建日期
|
||
diary_log["create_date"] = date
|
||
# 创建时间,控制在8点~11点之间
|
||
str_time1 = date.strftime("%Y-%m-%d ") + "08:00:00"
|
||
start_time = datetime.datetime.strptime(str_time1, "%Y-%m-%d %H:%M:%S")
|
||
str_time2 = date.strftime("%Y-%m-%d ") + "11:00:00"
|
||
end_time = datetime.datetime.strptime(str_time2, "%Y-%m-%d %H:%M:%S")
|
||
|
||
CreationTime = f.date_time_between(start_date=start_time, end_date=end_time)
|
||
diary_log["CreationTime"] = CreationTime
|
||
# 修改时间,比创建时间晚6~10小时
|
||
LastWriteTime = CreationTime + datetime.timedelta(
|
||
hours=f.pyint(min_value=6, max_value=10),
|
||
seconds=f.pyint(min_value=1, max_value=300),
|
||
)
|
||
diary_log["LastWriteTime"] = LastWriteTime
|
||
|
||
# 访问时间,比修改时间晚1~n天
|
||
LastAccessTime = LastWriteTime + datetime.timedelta(
|
||
days=f.pyint(min_value=0, max_value=n),
|
||
seconds=f.pyint(min_value=1, max_value=300),
|
||
)
|
||
diary_log["LastAccessTime"] = LastAccessTime
|
||
# 随机的状态,成功失败比 8:2
|
||
status_list = {"sucess": 80, "failed": 20}
|
||
diary_log["status1"] = random_weight(status_list)
|
||
|
||
datas.append(diary_log)
|
||
|
||
return datas
|
||
|
||
|
||
def random_weight(weight_data):
|
||
"""
|
||
按照权重,随机取值
|
||
eg:
|
||
weight_data = {'a': 10, 'b': 40, 'c': 50}
|
||
random_weight(weight_data)
|
||
"""
|
||
total = sum(weight_data.values()) # 权重求和
|
||
ra = random.uniform(0, total) # 在0与权重和之前获取一个随机数
|
||
curr_sum = 0
|
||
ret = None
|
||
# keys = weight_data.iterkeys() # 使用Python2.x中的iterkeys
|
||
keys = weight_data.keys() # 使用Python3.x中的keys
|
||
for k in keys:
|
||
curr_sum += weight_data[k] # 在遍历中,累加当前权重值
|
||
if ra <= curr_sum: # 当随机数<=当前权重和时,返回权重key
|
||
ret = k
|
||
break
|
||
return ret
|
||
|
||
|
||
def main(number):
|
||
# 获取数据
|
||
datas = faker_datas(number)
|
||
# 初始化输出目录
|
||
if OUTPUT.exists():
|
||
shutil.rmtree(OUTPUT)
|
||
OUTPUT.mkdir()
|
||
|
||
# 根据模板来生成数据
|
||
template_file = ETC / "template.md.j2"
|
||
for day_log in datas:
|
||
# 读取模板
|
||
jinja2_env = jinja2.Environment()
|
||
tempate_data = open(template_file, encoding="utf-8").read()
|
||
# 渲染模板
|
||
temp_out = jinja2_env.from_string(tempate_data).render({"datas": day_log})
|
||
|
||
# 输出结果
|
||
file_name = day_log["create_date"].strftime("%Y-%m-%d") + ".md"
|
||
output_file = OUTPUT / file_name
|
||
with open(output_file, "w", encoding="utf-8") as f:
|
||
f.writelines(temp_out)
|
||
|
||
# 修改生成文本的创建时间、修改时间和访问时间
|
||
# ls 'sysin.txt' | foreach-object { $_.CreationTime = '02/02/2021 01:01:01'; $_.LastWriteTime = '01/01/2021 01:01:01'; $_.LastAccessTime = '03/03/2021 01:01:01' }
|
||
args = (
|
||
"powershell.exe"
|
||
+ ' "ls '
|
||
+ "'"
|
||
+ str(output_file)
|
||
+ "'"
|
||
+ " | foreach-object { $_.CreationTime = '"
|
||
+ day_log["CreationTime"].strftime("%m/%d/%Y %H:%M:%S")
|
||
+ "'; $_.LastWriteTime = '"
|
||
+ day_log["LastWriteTime"].strftime("%m/%d/%Y %H:%M:%S")
|
||
+ "'; $_.LastAccessTime = '"
|
||
+ day_log["LastAccessTime"].strftime("%m/%d/%Y %H:%M:%S")
|
||
+ "' }\""
|
||
)
|
||
subprocess.call(args, shell=True)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# 生成30天的数据
|
||
main(30)
|