pyxllib 0.3.96__py3-none-any.whl → 0.3.197__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. pyxllib/algo/geo.py +12 -0
  2. pyxllib/algo/intervals.py +1 -1
  3. pyxllib/algo/matcher.py +78 -0
  4. pyxllib/algo/pupil.py +187 -19
  5. pyxllib/algo/specialist.py +2 -1
  6. pyxllib/algo/stat.py +38 -2
  7. {pyxlpr → pyxllib/autogui}/__init__.py +1 -1
  8. pyxllib/autogui/activewin.py +246 -0
  9. pyxllib/autogui/all.py +9 -0
  10. pyxllib/{ext/autogui → autogui}/autogui.py +40 -11
  11. pyxllib/autogui/uiautolib.py +362 -0
  12. pyxllib/autogui/wechat.py +827 -0
  13. pyxllib/autogui/wechat_msg.py +421 -0
  14. pyxllib/autogui/wxautolib.py +84 -0
  15. pyxllib/cv/slidercaptcha.py +137 -0
  16. pyxllib/data/echarts.py +123 -12
  17. pyxllib/data/jsonlib.py +89 -0
  18. pyxllib/data/pglib.py +514 -30
  19. pyxllib/data/sqlite.py +231 -4
  20. pyxllib/ext/JLineViewer.py +14 -1
  21. pyxllib/ext/drissionlib.py +277 -0
  22. pyxllib/ext/kq5034lib.py +0 -1594
  23. pyxllib/ext/robustprocfile.py +497 -0
  24. pyxllib/ext/unixlib.py +6 -5
  25. pyxllib/ext/utools.py +108 -95
  26. pyxllib/ext/webhook.py +32 -14
  27. pyxllib/ext/wjxlib.py +88 -0
  28. pyxllib/ext/wpsapi.py +124 -0
  29. pyxllib/ext/xlwork.py +9 -0
  30. pyxllib/ext/yuquelib.py +1003 -71
  31. pyxllib/file/docxlib.py +1 -1
  32. pyxllib/file/libreoffice.py +165 -0
  33. pyxllib/file/movielib.py +9 -0
  34. pyxllib/file/packlib/__init__.py +112 -75
  35. pyxllib/file/pdflib.py +1 -1
  36. pyxllib/file/pupil.py +1 -1
  37. pyxllib/file/specialist/dirlib.py +1 -1
  38. pyxllib/file/specialist/download.py +10 -3
  39. pyxllib/file/specialist/filelib.py +266 -55
  40. pyxllib/file/xlsxlib.py +205 -50
  41. pyxllib/file/xlsyncfile.py +341 -0
  42. pyxllib/prog/cachetools.py +64 -0
  43. pyxllib/prog/filelock.py +42 -0
  44. pyxllib/prog/multiprogs.py +940 -0
  45. pyxllib/prog/newbie.py +9 -2
  46. pyxllib/prog/pupil.py +129 -60
  47. pyxllib/prog/specialist/__init__.py +176 -2
  48. pyxllib/prog/specialist/bc.py +5 -2
  49. pyxllib/prog/specialist/browser.py +11 -2
  50. pyxllib/prog/specialist/datetime.py +68 -0
  51. pyxllib/prog/specialist/tictoc.py +12 -13
  52. pyxllib/prog/specialist/xllog.py +5 -5
  53. pyxllib/prog/xlosenv.py +7 -0
  54. pyxllib/text/airscript.js +744 -0
  55. pyxllib/text/charclasslib.py +17 -5
  56. pyxllib/text/jiebalib.py +6 -3
  57. pyxllib/text/jinjalib.py +32 -0
  58. pyxllib/text/jsa_ai_prompt.md +271 -0
  59. pyxllib/text/jscode.py +159 -4
  60. pyxllib/text/nestenv.py +1 -1
  61. pyxllib/text/newbie.py +12 -0
  62. pyxllib/text/pupil/common.py +26 -0
  63. pyxllib/text/specialist/ptag.py +2 -2
  64. pyxllib/text/templates/echart_base.html +11 -0
  65. pyxllib/text/templates/highlight_code.html +17 -0
  66. pyxllib/text/templates/latex_editor.html +103 -0
  67. pyxllib/text/xmllib.py +76 -14
  68. pyxllib/xl.py +2 -1
  69. pyxllib-0.3.197.dist-info/METADATA +48 -0
  70. pyxllib-0.3.197.dist-info/RECORD +126 -0
  71. {pyxllib-0.3.96.dist-info → pyxllib-0.3.197.dist-info}/WHEEL +1 -2
  72. pyxllib/ext/autogui/__init__.py +0 -8
  73. pyxllib-0.3.96.dist-info/METADATA +0 -51
  74. pyxllib-0.3.96.dist-info/RECORD +0 -333
  75. pyxllib-0.3.96.dist-info/top_level.txt +0 -2
  76. pyxlpr/ai/__init__.py +0 -5
  77. pyxlpr/ai/clientlib.py +0 -1281
  78. pyxlpr/ai/specialist.py +0 -286
  79. pyxlpr/ai/torch_app.py +0 -172
  80. pyxlpr/ai/xlpaddle.py +0 -655
  81. pyxlpr/ai/xltorch.py +0 -705
  82. pyxlpr/data/__init__.py +0 -11
  83. pyxlpr/data/coco.py +0 -1325
  84. pyxlpr/data/datacls.py +0 -365
  85. pyxlpr/data/datasets.py +0 -200
  86. pyxlpr/data/gptlib.py +0 -1291
  87. pyxlpr/data/icdar/__init__.py +0 -96
  88. pyxlpr/data/icdar/deteval.py +0 -377
  89. pyxlpr/data/icdar/icdar2013.py +0 -341
  90. pyxlpr/data/icdar/iou.py +0 -340
  91. pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -463
  92. pyxlpr/data/imtextline.py +0 -473
  93. pyxlpr/data/labelme.py +0 -866
  94. pyxlpr/data/removeline.py +0 -179
  95. pyxlpr/data/specialist.py +0 -57
  96. pyxlpr/eval/__init__.py +0 -85
  97. pyxlpr/paddleocr.py +0 -776
  98. pyxlpr/ppocr/__init__.py +0 -15
  99. pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -226
  100. pyxlpr/ppocr/data/__init__.py +0 -135
  101. pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -26
  102. pyxlpr/ppocr/data/imaug/__init__.py +0 -67
  103. pyxlpr/ppocr/data/imaug/copy_paste.py +0 -170
  104. pyxlpr/ppocr/data/imaug/east_process.py +0 -437
  105. pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -244
  106. pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -114
  107. pyxlpr/ppocr/data/imaug/label_ops.py +0 -789
  108. pyxlpr/ppocr/data/imaug/make_border_map.py +0 -184
  109. pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -106
  110. pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -126
  111. pyxlpr/ppocr/data/imaug/operators.py +0 -433
  112. pyxlpr/ppocr/data/imaug/pg_process.py +0 -906
  113. pyxlpr/ppocr/data/imaug/randaugment.py +0 -143
  114. pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -239
  115. pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -533
  116. pyxlpr/ppocr/data/imaug/sast_process.py +0 -777
  117. pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -17
  118. pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -120
  119. pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -168
  120. pyxlpr/ppocr/data/lmdb_dataset.py +0 -115
  121. pyxlpr/ppocr/data/pgnet_dataset.py +0 -104
  122. pyxlpr/ppocr/data/pubtab_dataset.py +0 -107
  123. pyxlpr/ppocr/data/simple_dataset.py +0 -372
  124. pyxlpr/ppocr/losses/__init__.py +0 -61
  125. pyxlpr/ppocr/losses/ace_loss.py +0 -52
  126. pyxlpr/ppocr/losses/basic_loss.py +0 -135
  127. pyxlpr/ppocr/losses/center_loss.py +0 -88
  128. pyxlpr/ppocr/losses/cls_loss.py +0 -30
  129. pyxlpr/ppocr/losses/combined_loss.py +0 -67
  130. pyxlpr/ppocr/losses/det_basic_loss.py +0 -208
  131. pyxlpr/ppocr/losses/det_db_loss.py +0 -80
  132. pyxlpr/ppocr/losses/det_east_loss.py +0 -63
  133. pyxlpr/ppocr/losses/det_pse_loss.py +0 -149
  134. pyxlpr/ppocr/losses/det_sast_loss.py +0 -121
  135. pyxlpr/ppocr/losses/distillation_loss.py +0 -272
  136. pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -140
  137. pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -113
  138. pyxlpr/ppocr/losses/rec_aster_loss.py +0 -99
  139. pyxlpr/ppocr/losses/rec_att_loss.py +0 -39
  140. pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -44
  141. pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -70
  142. pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -30
  143. pyxlpr/ppocr/losses/rec_sar_loss.py +0 -28
  144. pyxlpr/ppocr/losses/rec_srn_loss.py +0 -47
  145. pyxlpr/ppocr/losses/table_att_loss.py +0 -109
  146. pyxlpr/ppocr/metrics/__init__.py +0 -44
  147. pyxlpr/ppocr/metrics/cls_metric.py +0 -45
  148. pyxlpr/ppocr/metrics/det_metric.py +0 -82
  149. pyxlpr/ppocr/metrics/distillation_metric.py +0 -73
  150. pyxlpr/ppocr/metrics/e2e_metric.py +0 -86
  151. pyxlpr/ppocr/metrics/eval_det_iou.py +0 -274
  152. pyxlpr/ppocr/metrics/kie_metric.py +0 -70
  153. pyxlpr/ppocr/metrics/rec_metric.py +0 -75
  154. pyxlpr/ppocr/metrics/table_metric.py +0 -50
  155. pyxlpr/ppocr/modeling/architectures/__init__.py +0 -32
  156. pyxlpr/ppocr/modeling/architectures/base_model.py +0 -88
  157. pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -60
  158. pyxlpr/ppocr/modeling/backbones/__init__.py +0 -54
  159. pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -268
  160. pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -246
  161. pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -285
  162. pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -265
  163. pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -186
  164. pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -138
  165. pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -258
  166. pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -48
  167. pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -210
  168. pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -143
  169. pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -307
  170. pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -286
  171. pyxlpr/ppocr/modeling/heads/__init__.py +0 -54
  172. pyxlpr/ppocr/modeling/heads/cls_head.py +0 -52
  173. pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -118
  174. pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -121
  175. pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -37
  176. pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -128
  177. pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -253
  178. pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -206
  179. pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -163
  180. pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -393
  181. pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -202
  182. pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -88
  183. pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -826
  184. pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -402
  185. pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -280
  186. pyxlpr/ppocr/modeling/heads/self_attention.py +0 -406
  187. pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -246
  188. pyxlpr/ppocr/modeling/necks/__init__.py +0 -32
  189. pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -111
  190. pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -188
  191. pyxlpr/ppocr/modeling/necks/fpn.py +0 -138
  192. pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -314
  193. pyxlpr/ppocr/modeling/necks/rnn.py +0 -92
  194. pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -284
  195. pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -110
  196. pyxlpr/ppocr/modeling/transforms/__init__.py +0 -28
  197. pyxlpr/ppocr/modeling/transforms/stn.py +0 -135
  198. pyxlpr/ppocr/modeling/transforms/tps.py +0 -308
  199. pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -156
  200. pyxlpr/ppocr/optimizer/__init__.py +0 -61
  201. pyxlpr/ppocr/optimizer/learning_rate.py +0 -228
  202. pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -49
  203. pyxlpr/ppocr/optimizer/optimizer.py +0 -160
  204. pyxlpr/ppocr/optimizer/regularizer.py +0 -52
  205. pyxlpr/ppocr/postprocess/__init__.py +0 -55
  206. pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -33
  207. pyxlpr/ppocr/postprocess/db_postprocess.py +0 -234
  208. pyxlpr/ppocr/postprocess/east_postprocess.py +0 -143
  209. pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -200
  210. pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -52
  211. pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -15
  212. pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -29
  213. pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -14
  214. pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -118
  215. pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -654
  216. pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -355
  217. pyxlpr/ppocr/tools/__init__.py +0 -14
  218. pyxlpr/ppocr/tools/eval.py +0 -83
  219. pyxlpr/ppocr/tools/export_center.py +0 -77
  220. pyxlpr/ppocr/tools/export_model.py +0 -129
  221. pyxlpr/ppocr/tools/infer/predict_cls.py +0 -151
  222. pyxlpr/ppocr/tools/infer/predict_det.py +0 -300
  223. pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -169
  224. pyxlpr/ppocr/tools/infer/predict_rec.py +0 -414
  225. pyxlpr/ppocr/tools/infer/predict_system.py +0 -204
  226. pyxlpr/ppocr/tools/infer/utility.py +0 -629
  227. pyxlpr/ppocr/tools/infer_cls.py +0 -83
  228. pyxlpr/ppocr/tools/infer_det.py +0 -134
  229. pyxlpr/ppocr/tools/infer_e2e.py +0 -122
  230. pyxlpr/ppocr/tools/infer_kie.py +0 -153
  231. pyxlpr/ppocr/tools/infer_rec.py +0 -146
  232. pyxlpr/ppocr/tools/infer_table.py +0 -107
  233. pyxlpr/ppocr/tools/program.py +0 -596
  234. pyxlpr/ppocr/tools/test_hubserving.py +0 -117
  235. pyxlpr/ppocr/tools/train.py +0 -163
  236. pyxlpr/ppocr/tools/xlprog.py +0 -748
  237. pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -94
  238. pyxlpr/ppocr/utils/__init__.py +0 -24
  239. pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -117
  240. pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -162
  241. pyxlpr/ppocr/utils/dict/be_dict.txt +0 -145
  242. pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -140
  243. pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -8421
  244. pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -163
  245. pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -167
  246. pyxlpr/ppocr/utils/dict/en_dict.txt +0 -63
  247. pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -136
  248. pyxlpr/ppocr/utils/dict/french_dict.txt +0 -136
  249. pyxlpr/ppocr/utils/dict/german_dict.txt +0 -143
  250. pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -162
  251. pyxlpr/ppocr/utils/dict/it_dict.txt +0 -118
  252. pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -4399
  253. pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -153
  254. pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -3688
  255. pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -185
  256. pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -153
  257. pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -153
  258. pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -96
  259. pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -130
  260. pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -91
  261. pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -134
  262. pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -125
  263. pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -128
  264. pyxlpr/ppocr/utils/dict/table_dict.txt +0 -277
  265. pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -2759
  266. pyxlpr/ppocr/utils/dict/te_dict.txt +0 -151
  267. pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -114
  268. pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -142
  269. pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -137
  270. pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -110
  271. pyxlpr/ppocr/utils/dict90.txt +0 -90
  272. pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -574
  273. pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -83
  274. pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -87
  275. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -457
  276. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -592
  277. pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -162
  278. pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -162
  279. pyxlpr/ppocr/utils/en_dict.txt +0 -95
  280. pyxlpr/ppocr/utils/gen_label.py +0 -81
  281. pyxlpr/ppocr/utils/ic15_dict.txt +0 -36
  282. pyxlpr/ppocr/utils/iou.py +0 -54
  283. pyxlpr/ppocr/utils/logging.py +0 -69
  284. pyxlpr/ppocr/utils/network.py +0 -84
  285. pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -6623
  286. pyxlpr/ppocr/utils/profiler.py +0 -110
  287. pyxlpr/ppocr/utils/save_load.py +0 -150
  288. pyxlpr/ppocr/utils/stats.py +0 -72
  289. pyxlpr/ppocr/utils/utility.py +0 -80
  290. pyxlpr/ppstructure/__init__.py +0 -13
  291. pyxlpr/ppstructure/predict_system.py +0 -187
  292. pyxlpr/ppstructure/table/__init__.py +0 -13
  293. pyxlpr/ppstructure/table/eval_table.py +0 -72
  294. pyxlpr/ppstructure/table/matcher.py +0 -192
  295. pyxlpr/ppstructure/table/predict_structure.py +0 -136
  296. pyxlpr/ppstructure/table/predict_table.py +0 -221
  297. pyxlpr/ppstructure/table/table_metric/__init__.py +0 -16
  298. pyxlpr/ppstructure/table/table_metric/parallel.py +0 -51
  299. pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -247
  300. pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -13
  301. pyxlpr/ppstructure/table/tablepyxl/style.py +0 -283
  302. pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -118
  303. pyxlpr/ppstructure/utility.py +0 -71
  304. pyxlpr/xlai.py +0 -10
  305. /pyxllib/{ext/autogui → autogui}/virtualkey.py +0 -0
  306. {pyxllib-0.3.96.dist-info → pyxllib-0.3.197.dist-info/licenses}/LICENSE +0 -0
pyxllib/ext/utools.py CHANGED
@@ -27,7 +27,7 @@ import pyautogui
27
27
 
28
28
  from pyxllib.prog.specialist import browser, TicToc, parse_datetime
29
29
  from pyxllib.file.specialist import XlPath
30
- from pyxllib.ext.autogui import type_text, clipboard_decorator
30
+ from pyxllib.autogui.autogui import type_text, clipboard_decorator
31
31
 
32
32
 
33
33
  def _print_df_result(df, outfmt='text'):
@@ -113,6 +113,9 @@ class UtoolsBase:
113
113
 
114
114
  self.outfmt = self.cmds['outfmt'] if 'outfmt' in self.cmds else outfmt
115
115
 
116
+
117
+ class UtoolsName(UtoolsBase):
118
+
116
119
  def check_cmds(self):
117
120
  """ 显示所有参数值 """
118
121
  df = pd.DataFrame.from_records([(k, v) for k, v in self.cmds.items()],
@@ -130,101 +133,10 @@ class UtoolsBase:
130
133
  except OSError: # 忽略错误的扩展名
131
134
  f1 = XlPath.init('left', XlPath.tempdir())
132
135
  f2 = XlPath.init('right', XlPath.tempdir())
133
- f1.write_text(suffix)
134
- f2.write_text(self.cmds['ClipText'])
136
+ f1.write_text(self.cmds['ClipText'])
137
+ f2.write_text(self.cmds['ClipText'] + '\n')
135
138
  bcompare(f1, f2, wait=False)
136
139
 
137
-
138
- class UtoolsFile(UtoolsBase):
139
- """ 文件相关操作工具 """
140
-
141
- def __init__(self, cmds, *, outfmt='text'):
142
- super().__init__(cmds, outfmt=outfmt)
143
-
144
- # 如果是window等模式,补充 MatchedFiles
145
- if 'MatchedFiles' in self.cmds:
146
- self.paths = [pathlib.Path(f['path']) for f in self.cmds['MatchedFiles']]
147
- else:
148
- self.paths = [pathlib.Path(os.path.abspath(f)).resolve() for f in os.listdir('../robot')]
149
-
150
- @classmethod
151
- def is_image(cls, f):
152
- return bool(re.match('jpe?g|png|gif|bmp', f.suffix.lower()[1:]))
153
-
154
- def codefile(self):
155
- """ 多用途文件处理器
156
-
157
- 核心理念是不设定具体功能,而是让用户在 subinput 自己写需要执行的py代码功能
158
- 而在subinput,可以用一些特殊的标识符来传参
159
-
160
- 以file为例,有4类参数:
161
- file,处理当前目录 文件
162
- rfile,递归处理所有目录下 文件
163
- files,当前目录 所有文件
164
- rfiles,递归获取所有目录下 所有文件
165
-
166
- 类型上,file可以改为
167
- dir,只分析目录
168
- path,所有文件和目录
169
-
170
- 扩展了一些特殊的类型:
171
- imfile,图片文件
172
- """
173
- from functools import reduce
174
- try:
175
- from xlproject.xyz.kzconfig import KzDataSync
176
- from pyxlpr.data.labelme import reduce_labelme_jsonfile
177
- except ModuleNotFoundError:
178
- pass
179
-
180
- tt = TicToc()
181
-
182
- # 1 获得所有标识符
183
- # 每个单词前后都有空格,方便定界
184
- keywords = filter(lambda x: re.match(r'[a-zA-Z_]+$', x),
185
- set(re.findall(r'\.?[a-zA-Z_]+\(?', self.cmds['subinput'])))
186
- keywords = ' ' + ' '.join(keywords) + ' '
187
- # print('keywords:', keywords)
188
-
189
- # 2 生成一些备用的智能参数
190
- # 一级目录下选中的文件
191
- paths = self.paths
192
- # 用正则判断一些智能参数是否要计算,注意不能只判断files,如果出现file,也是要引用files的
193
- files = [XlPath(p) for p in paths if p.is_file()] if re.search(r'files? ', keywords) else []
194
- imfiles = [f for f in files if self.is_image(f)] if re.search(r' imfiles? ', keywords) else []
195
- # 出现r系列的递归操作,都是要计算出dirs的
196
- dirs = [XlPath(p) for p in paths if p.is_dir()] if re.search(r' (dirs?|r[a-zA-Z_]+) ', keywords) else []
197
-
198
- # 递归所有的文件
199
- rpaths = reduce(lambda x, y: x + y.select('**/*').subpaths(), [paths] + dirs) \
200
- if re.search(r' (r[a-zA-Z_]+) ', keywords) else []
201
- rfiles = [XlPath(p) for p in rpaths if p.is_file()] if re.search(r' (r(im)?files?) ', keywords) else []
202
- rimfiles = [f for f in rfiles if self.is_image(f)] if re.search(r' rimfiles? ', keywords) else []
203
- rdirs = [XlPath(p) for p in rpaths if p.is_dir()] if re.search(r' (rdirs?) ', keywords) else []
204
-
205
- # 3 判断是否要智能开循环处理
206
- m = re.search(r' (r?(path|(im)?file|dir)) ', keywords)
207
- if m:
208
- name = m.group(1)
209
- objs = eval(name + 's')
210
- print('len(' + name + 's)=', len(objs))
211
- for x in objs:
212
- locals()[name] = x
213
- eval(self.cmds['subinput'])
214
- else: # 没有的话就直接处理所有文件
215
- eval(self.cmds['subinput'])
216
-
217
- # 4 运行结束标志
218
- print(f'finished in {format_timespan(tt.tocvalue())}.')
219
-
220
- def open_jsonl(self):
221
- """ 打开jsonl文件 """
222
- from pyxllib.ext.JLineViewer import start_jlineviewer
223
- start_jlineviewer(self.paths[0].as_posix())
224
-
225
-
226
- class UtoolsText(UtoolsBase):
227
-
228
140
  @clipboard_decorator(copy=False, typing=True)
229
141
  def common_dir(self):
230
142
  # 目录路径生成工具
@@ -302,7 +214,7 @@ class UtoolsText(UtoolsBase):
302
214
  fire.Fire(func, self.cmds['subinput'], 'create_text_image')
303
215
 
304
216
 
305
- class UtoolsRegex(UtoolsBase):
217
+ class UtoolsText(UtoolsBase):
306
218
  def __init__(self, cmds, *, outfmt='text'):
307
219
  super().__init__(cmds, outfmt=outfmt)
308
220
 
@@ -333,6 +245,107 @@ class UtoolsRegex(UtoolsBase):
333
245
  bcompare(text1, text2)
334
246
 
335
247
 
248
+ class UtoolsFile(UtoolsBase):
249
+ """ 文件相关操作工具 """
250
+
251
+ def __init__(self, cmds, *, outfmt='text'):
252
+ super().__init__(cmds, outfmt=outfmt)
253
+
254
+ # 如果是window等模式,补充 MatchedFiles
255
+ if 'MatchedFiles' in self.cmds:
256
+ self.paths = [pathlib.Path(f['path']) for f in self.cmds['MatchedFiles']]
257
+ else:
258
+ self.paths = [pathlib.Path(os.path.abspath(f)).resolve() for f in os.listdir('../robot')]
259
+
260
+ @classmethod
261
+ def is_image(cls, f):
262
+ return bool(re.match('jpe?g|png|gif|bmp', f.suffix.lower()[1:]))
263
+
264
+ def codefile(self):
265
+ """ 多用途文件处理器
266
+
267
+ 核心理念是不设定具体功能,而是让用户在 subinput 自己写需要执行的py代码功能
268
+ 而在subinput,可以用一些特殊的标识符来传参
269
+
270
+ 以file为例,有4类参数:
271
+ file,处理当前目录 文件
272
+ rfile,递归处理所有目录下 文件
273
+ files,当前目录 所有文件
274
+ rfiles,递归获取所有目录下 所有文件
275
+
276
+ 类型上,file可以改为
277
+ dir,只分析目录
278
+ path,所有文件和目录
279
+
280
+ 扩展了一些特殊的类型:
281
+ imfile,图片文件
282
+ """
283
+ from functools import reduce
284
+ try:
285
+ from xlproject.xyz.kzconfig import KzDataSync
286
+ from pyxlpr.data.labelme import reduce_labelme_jsonfile
287
+ except ModuleNotFoundError:
288
+ pass
289
+
290
+ tt = TicToc()
291
+
292
+ # 1 获得所有标识符
293
+ # 每个单词前后都有空格,方便定界
294
+ keywords = filter(lambda x: re.match(r'[a-zA-Z_]+$', x),
295
+ set(re.findall(r'\.?[a-zA-Z_]+\(?', self.cmds['subinput'])))
296
+ keywords = ' ' + ' '.join(keywords) + ' '
297
+ # print('keywords:', keywords)
298
+
299
+ # 2 生成一些备用的智能参数
300
+ # 一级目录下选中的文件
301
+ paths = self.paths
302
+ # 用正则判断一些智能参数是否要计算,注意不能只判断files,如果出现file,也是要引用files的
303
+ files = [XlPath(p) for p in paths if p.is_file()] if re.search(r'files? ', keywords) else []
304
+ imfiles = [f for f in files if self.is_image(f)] if re.search(r' imfiles? ', keywords) else []
305
+ # 出现r系列的递归操作,都是要计算出dirs的
306
+ dirs = [XlPath(p) for p in paths if p.is_dir()] if re.search(r' (dirs?|r[a-zA-Z_]+) ', keywords) else []
307
+
308
+ # 递归所有的文件
309
+ rpaths = reduce(lambda x, y: x + y.select('**/*').subpaths(), [paths] + dirs) \
310
+ if re.search(r' (r[a-zA-Z_]+) ', keywords) else []
311
+ rfiles = [XlPath(p) for p in rpaths if p.is_file()] if re.search(r' (r(im)?files?) ', keywords) else []
312
+ rimfiles = [f for f in rfiles if self.is_image(f)] if re.search(r' rimfiles? ', keywords) else []
313
+ rdirs = [XlPath(p) for p in rpaths if p.is_dir()] if re.search(r' (rdirs?) ', keywords) else []
314
+
315
+ # 3 判断是否要智能开循环处理
316
+ m = re.search(r' (r?(path|(im)?file|dir)) ', keywords)
317
+ if m:
318
+ name = m.group(1)
319
+ objs = eval(name + 's')
320
+ print('len(' + name + 's)=', len(objs))
321
+ for x in objs:
322
+ locals()[name] = x
323
+ eval(self.cmds['subinput'])
324
+ else: # 没有的话就直接处理所有文件
325
+ eval(self.cmds['subinput'])
326
+
327
+ # 4 运行结束标志
328
+ print(f'finished in {format_timespan(tt.tocvalue())}.')
329
+
330
+ def open_jsonl(self):
331
+ """ 打开jsonl文件 """
332
+ from pyxllib.ext.JLineViewer import start_jlineviewer
333
+ start_jlineviewer(self.paths[0].as_posix())
334
+
335
+ def open_jsonl_with_excel(self):
336
+ """ 用excel打开jsonl文件 """
337
+ from pyxllib.algo.stat import write_dataframes_to_excel
338
+
339
+ file = self.paths[0].as_posix()
340
+ data = XlPath(file).read_jsonl()
341
+
342
+ file = XlPath.create_tempfile_path('.xlsx')
343
+ df = pd.DataFrame.from_dict(data)
344
+ write_dataframes_to_excel(file, {'Sheet1': df})
345
+
346
+ os.startfile(file)
347
+
348
+
336
349
  if __name__ == '__main__':
337
350
  with TicToc('utools'):
338
351
  pass
pyxllib/ext/webhook.py CHANGED
@@ -4,7 +4,7 @@
4
4
  # @Email : 877362867@qq.com
5
5
  # @Date : 2020/10/21 09:22
6
6
 
7
-
7
+ import os
8
8
  import time
9
9
  import hmac
10
10
  import hashlib
@@ -37,17 +37,11 @@ class DingtalkRobot:
37
37
  https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
38
38
  """
39
39
 
40
- def __init__(self, url, secret):
41
- self.base_url = url # 原始url,不包含时间戳和签名
42
- self.secret = secret
40
+ def __init__(self, access_token=None, secret=None):
41
+ access_token = access_token or os.getenv('DINGTALK_ROBOT_SECRET')
42
+ self.url = f'https://oapi.dingtalk.com/robot/send?access_token={access_token}'
43
+ self.url += self.add_secret(secret or os.getenv('DINGTALK_ROBOT_SECRET'))
43
44
  self.headers = {"Content-Type": "application/json"}
44
- self.last_timestamp = 0 # 初始化上次时间戳
45
- self.update_url() # 初始化时更新URL
46
-
47
- def update_url(self):
48
- """更新URL中的时间戳和签名"""
49
- self.url = self.base_url + self.add_secret(self.secret)
50
- self.last_timestamp = round(time.time()) # 更新上次时间戳
51
45
 
52
46
  @classmethod
53
47
  def add_secret(cls, secret):
@@ -61,9 +55,6 @@ class DingtalkRobot:
61
55
  return f'&timestamp={timestamp}&sign={sign}'
62
56
 
63
57
  def send_data(self, data):
64
- # 检查当前时间是否超过30分钟
65
- if round(time.time()) - self.last_timestamp > 1800: # 30 * 60
66
- self.update_url() # 更新URL
67
58
  try:
68
59
  requests.post(url=self.url, headers=self.headers, json=data)
69
60
  except requests.exceptions.ConnectionError as e: # 没网发送失败的时候也不报错
@@ -99,3 +90,30 @@ class DingtalkRobot:
99
90
 
100
91
  def send_feedcard(self):
101
92
  raise NotImplementedError
93
+
94
+
95
+ class DingtalkRobot2(DingtalkRobot):
96
+
97
+ def __init__(self, title=None):
98
+ super().__init__()
99
+ self.title = title
100
+
101
+ def send_text2(self, text): # 增加一个更加定制化的便捷接口
102
+ from pyxllib.prog.pupil import utc_timestamp
103
+
104
+ if self.title:
105
+ self.send_text(f'{utc_timestamp()} {get_host_nickname()} [{self.title}] {text}')
106
+ else:
107
+ self.send_text(f'{utc_timestamp()} {get_host_nickname()} {text}')
108
+
109
+ def __enter__(self):
110
+ self.send_text2('启动')
111
+ return self
112
+
113
+ def __exit__(self, exc_type, exc_val, exc_tb):
114
+ from pyxllib.prog.pupil import format_exception
115
+
116
+ if exc_tb is None:
117
+ self.send_text2('完成')
118
+ else:
119
+ self.send_text2(f'报错\n{format_exception(exc_val, 3)}')
pyxllib/ext/wjxlib.py ADDED
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2024/11/19
6
+
7
+ """ 问卷星 相关工具 """
8
+
9
+ import os
10
+ import io
11
+ import time
12
+
13
+ from loguru import logger
14
+ from DrissionPage import Chromium
15
+ import pandas as pd
16
+
17
+ from pyxllib.ext.drissionlib import DpWebBase
18
+
19
+
20
+ class WjxWeb(DpWebBase):
21
+ """ 问卷星网页的爬虫 """
22
+
23
+ def __init__(self, url=None):
24
+ super().__init__(url or 'https://www.wjx.cn')
25
+ self.login()
26
+
27
+ def login(self):
28
+ tab = self.tab
29
+
30
+ if tab.url.startswith('https://www.wjx.cn/wjx/activitystat/resultlimit.aspx'):
31
+ tab('tag:a@@text():登录').click()
32
+
33
+ if tab.url.lower().startswith('https://www.wjx.cn/login.aspx'):
34
+ tab('tag:input@@name=UserName').input(os.getenv('WJX_USERNAME'), clear=True)
35
+ tab('tag:input@@name=Password').input(os.getenv('WJX_PASSWORD'), clear=True)
36
+ tab('tag:input@@type=submit').click()
37
+
38
+ def get_page_num(self):
39
+ """
40
+ 返回当前页编号和总页数 (idx, num)。
41
+ """
42
+ idx, num = map(int, self.tab('tag:span@@class=paging-num').text.split('/'))
43
+ return idx, num
44
+
45
+ def prev_page(self):
46
+ self.tab('tag:a@@class=go-pre').click()
47
+
48
+ def next_page(self):
49
+ self.tab('tag:a@@class=go-next').click()
50
+
51
+ def _parse_table(self):
52
+ """处理并解析网页中的表格数据"""
53
+ table_html = self.tab('tag:table').html
54
+ df = pd.read_html(io.StringIO(table_html))[0] # 读取表格
55
+ df.columns = [col.replace('\ue645', '') for col in df.columns]
56
+ # "星标"的内容特殊字符
57
+ df.replace('\ue66b', '', regex=True, inplace=True)
58
+ # "操作"的内容特殊字符
59
+ df.replace('\ue6a3\ue6d4', '', regex=True, inplace=True)
60
+ return df
61
+
62
+ def set_num_of_page(self, num_of_page):
63
+ """ 查看数据页面,设置每页显示多少条记录 """
64
+ select = self.tab('tag:span@@text():每页显示').next('tag:select')
65
+ select.click()
66
+ opt = select(f'tag:option@@text()={num_of_page}')
67
+ if opt.attr('selected') != 'selected':
68
+ opt.click()
69
+ else:
70
+ select.click()
71
+
72
+ def get_df(self, all_pages=False):
73
+ """获得当前页面的表格数据,如果 all_pages 为 True,则下载所有页面的数据"""
74
+ # 初始化DataFrame列表,用于存储每页的数据
75
+ dfs = [self._parse_table()] # 获取当前页面的数据
76
+
77
+ # 如果需要下载所有页面数据
78
+ if all_pages:
79
+ current_idx, total_pages = self.get_page_num()
80
+ while current_idx < total_pages:
81
+ self.next_page() # 翻到下一页
82
+ time.sleep(2)
83
+ dfs.append(self._parse_table()) # 获取并处理新一页的数据
84
+ current_idx, total_pages = self.get_page_num() # 更新页码信息
85
+
86
+ # 将所有数据合并为一个DataFrame
87
+ final_df = pd.concat(dfs, ignore_index=True) if all_pages else dfs[0]
88
+ return final_df
pyxllib/ext/wpsapi.py ADDED
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Date : 2024/07/31
5
+
6
+ import os
7
+ import re
8
+
9
+ import requests
10
+ import pandas as pd
11
+
12
+
13
+ class WpsOnlineBook:
14
+ """ wps的"脚本令牌"调用模式
15
+
16
+ 官方文档:https://airsheet.wps.cn/docs/apitoken/api.html
17
+ """
18
+
19
+ def __1_基础功能(self):
20
+ pass
21
+
22
+ def __init__(self, file_id, script_id=None, *, token=None):
23
+ self.headers = {
24
+ 'Content-Type': "application/json",
25
+ 'AirScript-Token': token or os.getenv('WPS_SCRIPT_TOKEN', ''),
26
+ }
27
+ self.file_id = file_id
28
+ self.default_script_id = script_id
29
+
30
+ def post_request(self, url, payload):
31
+ """
32
+ 发送 POST 请求到指定的 URL 并返回响应结果
33
+ """
34
+ try:
35
+ resp = requests.post(url, json=payload, headers=self.headers)
36
+ resp.raise_for_status() # 如果请求失败会抛出异常
37
+ return resp.json()
38
+ except requests.exceptions.RequestException as e:
39
+ print(f"请求失败: {e}")
40
+ return None
41
+
42
+ def run_script(self, script_id=None, context_argv=None, sync=True):
43
+ """ 原本执行 WPS 脚本并返回执行结果
44
+
45
+ :param script_id: 脚本 ID
46
+ :param context_argv: 脚本参数 (可选)
47
+ context本来能支持这些参数的:
48
+ dict argv: 传入的上下文参数对象,比如传入{name: 'xiaomeng', age: 18}, 在 AS 代码中可通过Context.argv.name获取到传入的值
49
+ str sheet_name: et,ksheet 运行时所在表名
50
+ str range: et,ksheet 运行时所在区域,例如$B$156
51
+ str link_from: et,ksheet 点击超链接所在单元格
52
+ str db_active_view: db 运行时所在 view 名
53
+ str db_selection: db 运行时所在选区
54
+ 但是,sheet_name, range等,并看不到对运行代码有什么实质影响,不影响active,而且as里也引用不了sheet_name等值
55
+ 所以退化,简化为只要传入content_argv参数就行
56
+ :param sync:
57
+ True, 同步运行
58
+ False, 异步运行
59
+
60
+ 这个接口跟普通as一样,运行有30秒时限
61
+ """
62
+ url = f"https://www.kdocs.cn/api/v3/ide/file/{self.file_id}/script/{script_id}/{'sync_task' if sync else 'task'}"
63
+ payload = {
64
+ "Context": {'argv': context_argv or {}}
65
+ }
66
+ res = self.post_request(url, payload)
67
+ if sync:
68
+ return res['data']['result']
69
+ else:
70
+ return res
71
+
72
+ def __2_封装的更高级的接口(self):
73
+ """ 这系列的功能需要配套这个框架范式使用:
74
+ https://github.com/XLPRUtils/pyxllib/blob/master/pyxllib/text/airscript.js
75
+ """
76
+ pass
77
+
78
+ def run_func(self, func_name, *args):
79
+ """ 我自己常用的jsa框架,jsa那边已经简化了对接模式,所以一般都只用这个高级的接口即可
80
+ (旧函数名run_script2不再使用)
81
+ """
82
+ return self.run_script(self.default_script_id, context_argv={'funcName': func_name, 'args': args})
83
+
84
+ def get_sheet_data(self, sheet_name, fields, data_row=0, filter_empty_rows=True, *,
85
+ return_mode='pd') -> pd.DataFrame:
86
+ """ 获取某张sheet表格数据
87
+
88
+ :param sheet_name: sheet表名
89
+ :param list[str] fields: 字段名列表
90
+ :param int data_row: 数据起始行,详细用法见packTableDataFields
91
+ :param return_mode: 'pd' or 'json'
92
+ """
93
+ data = self.run_func('packTableDataFields', sheet_name, fields, data_row, filter_empty_rows)
94
+ if return_mode == 'json':
95
+ return data
96
+ elif return_mode == 'pd':
97
+ return pd.DataFrame(data)
98
+
99
+ def write_arr(self, rows, start_cell, batch_size=None):
100
+ """ 把一个二维数组数据写入表格
101
+
102
+ :param rows: 一个n*m的数据
103
+ :param start_cell: 写入的起始位置,例如'A1',也可以使用Sheet1!A1的格式表示具体的表格位置
104
+ :param batch_size: 为了避免一次写入内容过多,超时写入失败,可以分成多批运行
105
+ 这里写每批的数据行数
106
+ 默认表示一次性全部提交
107
+ :return:
108
+ """
109
+ if batch_size is None:
110
+ batch_size = len(rows) # 如果未指定批次大小,一次性写入所有行
111
+
112
+ def func(m):
113
+ return str(int(m.group()) + batch_size)
114
+
115
+ current_cell = start_cell
116
+ for start in range(0, len(rows), batch_size):
117
+ end = start + batch_size
118
+ batch_rows = rows[start:end]
119
+ self.run_func('writeArrToSheet', batch_rows, current_cell)
120
+ current_cell = re.sub(r'\d+$', func, current_cell)
121
+
122
+
123
+ if __name__ == '__main__':
124
+ pass
pyxllib/ext/xlwork.py ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2025/04/17
6
+
7
+ """ code4101的众多账号密码管理接口,工作目录等控制位置 """
8
+
9
+