python+faker生成文件

根据文件的模板,使用faker来生成指定时间范围内的文件

1. 背景

由于项目测试需要一批不同时间的创建的文件。一个个去手动修改文件的创建时间太耗时了,因此写个脚本去统一的做。

2.实现

主要是faker+jinja2两个库来实现的,faker产生数据,jinja2制作模板,由此生成一个文件。

项目地址:https://gitea.kiki.kim/ha/faker_diary.git

目录结构:

1
2
3
4
5
6
+--faker_files/
| +--bin/
| | +-- faker_diary.py # -- 主程序
| +--etc/ # -- 模板文件夹
| | +-- template.md.j2 # 模板文件
| +--output/ # -- 生成的文件目录

核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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)
.........
.........
def main(number):
.........
.........
# 读取模板
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)