goatest - 一个处理批量数据python脚本的分享

脚本包含功能:json数据转excel文件,自定义正则表达式提取批量数据,两个excel文件进行数据匹配,批量数据的编码解码等。

环境准备

执行脚本提示缺少模块,使用命令‘pip install 模块名’ 或 ‘pip3 install 模块名’即可:

  1. import re
  2. import openpyxl
  3. from openpyxl import Workbook
  4. import base64
  5. from urllib import parse
  6. import pypinyin

功能实现

功能分类

  1. 1. json2excel() #从一串josn{}{}中获取到想要的结果,可匹配任意数量的变量,并写入指定的excel文件中
  2. 2. re2excel() #从文本中使用正则表达式筛选出信息到excel文件中,正则表达式需自定义
  3. 3. excel2_pipei() #匹配两个excel,以key为匹配参数从excel2中检索信息填写在excel1的某一列中
  4. 4. encode_decode() #对单条数据或多条数据进行编码解码处理,包含base64,url,unicode,拼音处理


json2excel()

从一串josn{}{}中获取到想要的结果,可匹配任意数量的变量,并写入指定的excel文件中。
使用场景:
通常用于批量数据处理分析、暴力破解快速获得用户名使用。
示例json数据:

  1. {"rows":[{"Id":3170,"UserName":"test1","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3172,"UserName":"user2","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3173,"UserName":"user3","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3174,"UserName":"user4","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3175,"UserName":"user5","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183},{"Id":3185,"UserName":"user6","CreateDate":"2021-11-12 14:34","RoleName":"测试","RoleId":183}]}

使用方法1-全部提取:
🦿脚本📕 - 图1
处理结果:
🦿脚本📕 - 图2使用方法2-部分提取:
当json数据中一条数据参数过多,而你只想提取某个参数时,使用该方法
🦿脚本📕 - 图3
处理结果:
🦿脚本📕 - 图4

re2excel()

从文本中使用正则表达式筛选出信息到excel文件中,正则表达式需自定义。
使用场景:
对于非json数据,如需批量获得具有类似数据的值,可使用该方法处理,需具备一定正则表达式的知识。
示例处理数据:

  1. <li> <a href="https://www.cnblogs.com/test1">机器学习<span class="tag-count">(72)</span></a> </li> <li> <a href="https://www.cnblogs.com/test2">人工智能<span class="tag-count">(64)</span></a> </li> <li> <a href="https://www.cnblogs.com/test3">前端<span class="tag-count">(21)</span></a> </li>

使用方法:
🦿脚本📕 - 图5
由于在cmd下直接输入正则表达式容易误输入中文字符,建议现在notepad++上尝试是否能匹配到。
🦿脚本📕 - 图6
处理结果:
🦿脚本📕 - 图73.3 excel2_pipei()
匹配两个excel,以key为匹配参数从excel2中检索信息填写在excel1的某一列中。
使用场景:
excel1保存了id、username,excel2保存了id、password,可使用该方法将两个excel的数据进行匹配,获得比较全的数据,在企业自测口令安全中使用较多。
示例数据:
excel1

id username
1001 张三
1002 李四
1003 王五

excel2

id password
1001 123456
1003 111111

使用方法:
🦿脚本📕 - 图8
处理结果:
🦿脚本📕 - 图9

encode_decode()

对单条数据或多条数据进行编码解码处理,包含base64,url,unicode,拼音处理
使用场景:
处于内网环境,无法在线使用编码解码工具,根据姓名输出可能的密码字典
使用方法1-base64编码解码处理:
🦿脚本📕 - 图10
使用方法2-url编码解码处理:
🦿脚本📕 - 图11
使用方法3-Unicode编码解码处理:
🦿脚本📕 - 图12使用方法4-拼音全拼简拼处理:
🦿脚本📕 - 图13
使用方法5-循环输入单条数据:
🦿脚本📕 - 图14
使用方法6-从文本中读取批量数据处理:
🦿脚本📕 - 图15

整体使用

使用方法:命令台下执行‘python tool_tool.py’ or ‘python3 tool_tool.py’
🦿脚本📕 - 图16

源代码

由于本人为非专业的开发人员,代码实现上可能会较为繁琐,仅为实现相关功能。
代码上已实现输入参数的校验及循环输入,输出文件保存错误提示,代码小白也可以正常使用,具备较好的友好性。

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # author:goat time:2021/11/15
  4. '''
  5. 基础函数
  6. 1 text2list() #从text中读取数据并返回一个list
  7. 2 list2text() #把list转化为text,可指定间隔符
  8. 3 listll2excel() #把list[][]按行写入excel
  9. 4 excel2listll() #把excel转换为list[][]
  10. 5 base64_url() #base64/url编码解码
  11. 6 pinyin_list2str() #把字符串进行base64/url等编码解码处理
  12. 7 encode_decode_io() #循环监听输入的处理方式,直到输入正确
  13. '''
  14. import re
  15. import openpyxl
  16. from openpyxl import Workbook
  17. import base64
  18. from urllib import parse
  19. import pypinyin
  20. '''
  21. 从text中读取数据并返回一个list
  22. '''
  23. def text2list(text_path):
  24. l = []
  25. with open(text_path, encoding='utf-8') as f:
  26. text = f.read()
  27. for l1 in re.split(r'[\s\n,;]+', text): # 以文本中空格,回车,逗号,顿号为切割符处理
  28. l.append(l1)
  29. return l
  30. '''
  31. 把list转化为text,可指定间隔符
  32. '''
  33. def list2text(l, text_path, tag):
  34. with open(text_path, 'w', encoding='utf-8') as f:
  35. for i in l:
  36. f.write(str(i) + tag)
  37. '''
  38. 把二层list[][]按行写入excel
  39. '''
  40. def listll2excel(ll, excel_path):
  41. wb = Workbook()
  42. ws = wb.active
  43. for x in ll:
  44. ws.append(x)
  45. wb.save(excel_path)
  46. '''
  47. 把excel转换为list[][]
  48. '''
  49. def excel2listll(excel_path, sheet_index=0):
  50. wb = openpyxl.load_workbook(excel_path)
  51. ws = wb[wb.sheetnames[sheet_index]]
  52. total_list = []
  53. for row in ws.rows: # ws.rows是一个生成器
  54. row_list = []
  55. for cell in row: # 直接从行中取每个cell
  56. row_list.append(cell.value)
  57. total_list.append(row_list)
  58. return total_list
  59. '''
  60. 把pinyin处理的多层list提取出来处理为一个字符串
  61. '''
  62. def pinyin_list2str(ll, level):
  63. s = ''
  64. if level == 0:
  65. for x in ll:
  66. s = s + x[0]
  67. elif level == 1:
  68. for x in ll:
  69. s = s + x[0][0]
  70. else:
  71. s = '处理错误'
  72. return s
  73. '''
  74. 把字符串进行base64/url等编码解码处理
  75. '''
  76. def base64_url(s, k):
  77. if k == '00': # base64编码
  78. x = base64.b64encode(s.encode('utf-8')).decode('utf-8')
  79. elif k == '01': # base64解码
  80. x = base64.b64decode(s.encode('utf-8')).decode('utf-8')
  81. elif k == '10': # url编码
  82. x = parse.quote(s)
  83. elif k == '11': # url解码
  84. x = parse.unquote(s)
  85. elif k == '20': # unicode编码
  86. x = s.encode('unicode_escape').decode('utf-8')
  87. elif k == '21': # unicode解码
  88. x = s.encode('utf-8').decode('unicode_escape')
  89. elif k == '30': # 拼音全拼输出
  90. x = pinyin_list2str(pypinyin.pinyin(s, style=pypinyin.NORMAL), 0)
  91. elif k == '31': # 拼音首字母输出
  92. x = pinyin_list2str(pypinyin.pinyin(s, style=pypinyin.NORMAL), 1)
  93. else:
  94. x = '测试处理参数输入信息错误!'
  95. return x
  96. '''
  97. 循环监听输入的处理方式,直到输入正确
  98. '''
  99. def encode_decode_io():
  100. global k
  101. print('base64编码:00,base64解码:01; url编码:10,url解码:11; unicode编码:20,unicode解码:21;拼音全拼输出:30,拼音首字母输出:31; 输入end返回上一级')
  102. in_k = input("请输入处理方法>>>")
  103. if in_k in ['00', '01', '10', '11', '20', '21', '30', '31']:
  104. k = in_k
  105. elif in_k == 'end':
  106. main()
  107. else:
  108. print("参数选取错误!")
  109. encode_decode_io() # 自循环等待输入成功
  110. message = '''
  111. 对数据进行批量加工处理,输入序号选择
  112. 1 json2excel() #从一串josn{}{}中获取到想要的结果,可匹配任意数量的变量,并写入指定的excel文件中
  113. 2 re2excel() #从文本中使用正则表达式筛选出信息到excel文件中,正则表达式需自定义
  114. 3 excel2_pipei() #匹配两个excel,以key为匹配参数从excel2中检索信息填写在excel1的某一列中
  115. 4 encode_decode() #对单条数据或多条数据进行编码解码处理,包含base64,url,unicode,拼音处理
  116. '''
  117. '''
  118. 从一串josn{}{}中获取到想要的结果,可匹配任意数量的变量,并写入指定excel文件中
  119. '''
  120. def json2excel():
  121. path_du = input("请输入要读取的json文件地址,同路径下直接输入文件名,或输入绝对或相对路径>>>")
  122. with open(path_du, 'r', encoding='utf-8') as f: # 读取
  123. s = f.read()
  124. list_xuqiu = [] # 保存需提取的值
  125. json_key = re.findall('{.*?\[({.*?})', s, re.S) # 获取第一个{}
  126. list_xuqiu = re.findall('"([a-zA-Z0-9]+)":', json_key[0], re.S) # 获取key值
  127. print("自动识别json数据为:", list_xuqiu)
  128. auto = input("提取部分参数输入0,全部提取输入任意值>>>")
  129. if auto == '0':
  130. list_xuqiu = [] # 手动提取时先置空
  131. while True == True:
  132. xuqiu = input("请输入需要匹配的参数,输入0结束>>>")
  133. if xuqiu != '0':
  134. list_xuqiu.append(xuqiu)
  135. else:
  136. break
  137. elif auto == '1':
  138. pass
  139. print("提取数据为:", list_xuqiu)
  140. list_xuqiu_compile = []
  141. for i in range(len(list_xuqiu)):
  142. list_xuqiu_compile.append(re.compile(str(list_xuqiu[i] + '\":(.*?)[,}]'), re.S))
  143. # print(list_xuqiu_compile)#查看匹配集合是否出问题
  144. c = re.compile('{.*?}', re.S) # 定位每个框
  145. results = re.findall(c, s)
  146. # print(results)#查看{}返回结果
  147. path_xie = input("请输入需要输出的excel文件名称,如1.xlsx>>>")
  148. ll_result = [] # 获取到的结果记录在ll_result中
  149. ll_result.append(list_xuqiu) # 把需求参数添加,后续写在excel的第一行
  150. for result in results: # 遍历每个框
  151. l_result = []
  152. for cc in list_xuqiu_compile: # 遍历寻找几个值
  153. ccc = re.findall(cc, result)
  154. if ccc:
  155. l_result.append(re.sub(r'[\"]', '', ccc[0])) # 去除“”包裹
  156. else:
  157. l_result.append('无')
  158. ll_result.append(l_result)
  159. # print(ll_result)
  160. listll2excel(ll_result, path_xie)
  161. print("写入完成,请查看同目录下文件")
  162. '''
  163. 从文本中使用正则表达式筛选出信息到excel文件中,正则表达式需自定义
  164. '''
  165. def re2excel():
  166. path_du = input("请输入要读取的文件地址,同路径下直接输入文件名,或输入绝对或相对路径>>>")
  167. with open(path_du, 'r', encoding='utf-8') as f: # 读取
  168. s = f.read()
  169. str_re = input("请输入自定义正则表达式,请注意中英文字符,建议先在notepad++单条查询尝试>>>")
  170. c = re.compile(str_re, re.S)
  171. results = re.findall(c, s)
  172. # print(results)#查看{}返回结果
  173. path_xie = input("请输入需要输出的excel文件名称,如1.xlsx>>>")
  174. try:
  175. listll2excel(results, path_xie)
  176. print("写入完成,请查看同目录下文件")
  177. except:
  178. print("保存失败,请确认同名文件未被打开")
  179. '''
  180. 匹配两个excel,以key为匹配参数从excel2中检索信息填写在excel1的某一列中
  181. '''
  182. def excel2_pipei():
  183. print("---\n比如1.xlsx保存了'id','name',2.xlsx保存了'id','passwd',则可以将2.xlsx的passwd信息写入1.xlsx的某一列\n---")
  184. excel_path1 = input("请输入需写入信息的excel文件地址,同路径下直接输入文件名,或输入绝对或相对路径>>>")
  185. l1_key = input("请输入excel-key所在的列,如第一列输入1>>>")
  186. l1_value = input("请输入excel被写入的列值,如第二列输入2>>>")
  187. l1 = [int(l1_key), int(l1_value)]
  188. wb = openpyxl.load_workbook(excel_path1)
  189. ws = wb[wb.sheetnames[0]]
  190. excel_path2 = input("请输入需提取信息的excel文件地址,同路径下直接输入文件名,或输入绝对或相对路径>>>")
  191. l2_key = input("请输入excel-key所在的列,如第一列输入1>>>")
  192. l2_value = input("请输入需提取的值所在的列,如第二列输入2>>>")
  193. l2 = [int(l2_key), int(l2_value)]
  194. ll = excel2listll(excel_path2)
  195. dict_index = {}
  196. for x in ll:
  197. key_s = str(x[l2[0] - 1]).strip() # .strip()去除前后空格
  198. value_s = str(x[l2[1] - 1])
  199. dict_index[key_s] = value_s
  200. # print(dict_index.keys())
  201. for r in range(1, ws.max_row + 1):
  202. key_ss = str(ws.cell(r, l1[0]).value).strip()
  203. if key_ss in dict_index.keys():
  204. ws.cell(r, l1[1]).value = str(dict_index[key_ss])
  205. # print(key_ss,dict_index[key_ss])
  206. else:
  207. pass
  208. # print(key_ss,"无法匹配")
  209. try:
  210. wb.save(excel_path1)
  211. print("保存成功,请查看被写入excel文件")
  212. except:
  213. print("保存失败,请关闭被写入信息的excel文件再操作")
  214. c = input("请确认关闭文件后,输入任意信息继续保存>>>")
  215. if c:
  216. print("再次保存,请查看是否保存成功")
  217. wb.save(excel_path1)
  218. '''
  219. 对单条数据或多条数据进行编码解码处理,包含base64,url
  220. '''
  221. def encode_decode():
  222. code_way = input("处理单条数据输入0,处理批量数据输入1>>>")
  223. if code_way == '0':
  224. while True == True:
  225. s = input("可循环输入,输入end结束循环,请输入单条字符串数据>>>")
  226. if s != 'end':
  227. s2 = base64_url(s, k)
  228. print("结果为: ", s2)
  229. else:
  230. encode_decode_io()
  231. encode_decode()
  232. break
  233. elif code_way == '1':
  234. path_du = input("请输入文件名称>>>")
  235. l = text2list(path_du)
  236. l2 = []
  237. for s in l:
  238. x = base64_url(s, k)
  239. l2.append(x)
  240. path_xie = input("处理完成,请输入写入的文件名称>>>")
  241. list2text(l2, path_xie, '\n')
  242. print("写入完成,请查看文件" + path_xie)
  243. else:
  244. print("参数选取错误!")
  245. encode_decode()
  246. '''
  247. 定义用户输入选择
  248. '''
  249. k = ''#全局变量k,定义用户的编码处理方式
  250. def IO():
  251. way = input("请输入要执行的操作>>>")
  252. if way == '1':
  253. json2excel()
  254. elif way == '2':
  255. re2excel()
  256. elif way == '3':
  257. excel2_pipei()
  258. elif way == '4':
  259. k = ''
  260. encode_decode_io() # 循环等待输入成功,将正确的in_k赋值给全局变量K
  261. encode_decode()
  262. else:
  263. print("参数选取错误!")
  264. IO()
  265. def main():
  266. while True == True:
  267. print(message)
  268. IO()
  269. io = input("处理完成,是否还要再处理数据,输入任意字符继续,输入end结束>>>")
  270. if io == 'end':
  271. break
  272. if __name__ == '__main__':
  273. main()

结语

这是本人的第一次工具分享,实现的功能和方法都比较基础,大佬高抬贵手。文章中部分名词或描述可能存在错误,代码实现可能存在部分缺陷,欢迎讨论和指出。
编写该工具的目的,最开始是因为企业自查弱口令,方便从返回包提取用户名进行暴力破解,再对弱口令账户关联身份信息;暴力破解过程中,部分系统会进行简单编码,并可以通过身份信息构造相应的弱密码字典,在弱口令自查中有奇效;后面是在风控分析中,可手动关联多个excel表,手动分析出异常行为用户(手动的原因当然是目前还没有风控系统)。

一起学Python - 30个极简Python代码

30个极简Python代码