pyxllib 0.3.96__py3-none-any.whl → 0.3.200__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 (358) hide show
  1. pyxllib/__init__.py +21 -21
  2. pyxllib/algo/__init__.py +8 -8
  3. pyxllib/algo/disjoint.py +54 -54
  4. pyxllib/algo/geo.py +541 -529
  5. pyxllib/algo/intervals.py +964 -964
  6. pyxllib/algo/matcher.py +389 -311
  7. pyxllib/algo/newbie.py +166 -166
  8. pyxllib/algo/pupil.py +629 -461
  9. pyxllib/algo/shapelylib.py +67 -67
  10. pyxllib/algo/specialist.py +241 -240
  11. pyxllib/algo/stat.py +494 -458
  12. pyxllib/algo/treelib.py +149 -149
  13. pyxllib/algo/unitlib.py +66 -66
  14. {pyxlpr → pyxllib/autogui}/__init__.py +5 -5
  15. pyxllib/autogui/activewin.py +246 -0
  16. pyxllib/autogui/all.py +9 -0
  17. pyxllib/{ext/autogui → autogui}/autogui.py +852 -823
  18. pyxllib/autogui/uiautolib.py +362 -0
  19. pyxllib/{ext/autogui → autogui}/virtualkey.py +102 -102
  20. pyxllib/autogui/wechat.py +827 -0
  21. pyxllib/autogui/wechat_msg.py +421 -0
  22. pyxllib/autogui/wxautolib.py +84 -0
  23. pyxllib/cv/__init__.py +5 -5
  24. pyxllib/cv/expert.py +267 -267
  25. pyxllib/cv/imfile.py +159 -159
  26. pyxllib/cv/imhash.py +39 -39
  27. pyxllib/cv/pupil.py +9 -9
  28. pyxllib/cv/rgbfmt.py +1525 -1525
  29. pyxllib/cv/slidercaptcha.py +137 -0
  30. pyxllib/cv/trackbartools.py +251 -251
  31. pyxllib/cv/xlcvlib.py +1040 -1040
  32. pyxllib/cv/xlpillib.py +423 -423
  33. pyxllib/data/echarts.py +240 -129
  34. pyxllib/data/jsonlib.py +89 -0
  35. pyxllib/data/oss.py +72 -72
  36. pyxllib/data/pglib.py +1127 -643
  37. pyxllib/data/sqlite.py +568 -341
  38. pyxllib/data/sqllib.py +297 -297
  39. pyxllib/ext/JLineViewer.py +505 -492
  40. pyxllib/ext/__init__.py +6 -6
  41. pyxllib/ext/demolib.py +246 -246
  42. pyxllib/ext/drissionlib.py +277 -0
  43. pyxllib/ext/kq5034lib.py +12 -1606
  44. pyxllib/ext/old.py +663 -663
  45. pyxllib/ext/qt.py +449 -449
  46. pyxllib/ext/robustprocfile.py +497 -0
  47. pyxllib/ext/seleniumlib.py +76 -76
  48. pyxllib/ext/tk.py +173 -173
  49. pyxllib/ext/unixlib.py +827 -826
  50. pyxllib/ext/utools.py +351 -338
  51. pyxllib/ext/webhook.py +124 -101
  52. pyxllib/ext/win32lib.py +40 -40
  53. pyxllib/ext/wjxlib.py +88 -0
  54. pyxllib/ext/wpsapi.py +124 -0
  55. pyxllib/ext/xlwork.py +9 -0
  56. pyxllib/ext/yuquelib.py +1105 -173
  57. pyxllib/file/__init__.py +17 -17
  58. pyxllib/file/docxlib.py +761 -761
  59. pyxllib/file/gitlib.py +309 -309
  60. pyxllib/file/libreoffice.py +165 -0
  61. pyxllib/file/movielib.py +148 -139
  62. pyxllib/file/newbie.py +10 -10
  63. pyxllib/file/onenotelib.py +1469 -1469
  64. pyxllib/file/packlib/__init__.py +330 -293
  65. pyxllib/file/packlib/zipfile.py +2441 -2441
  66. pyxllib/file/pdflib.py +426 -426
  67. pyxllib/file/pupil.py +185 -185
  68. pyxllib/file/specialist/__init__.py +685 -685
  69. pyxllib/file/specialist/dirlib.py +799 -799
  70. pyxllib/file/specialist/download.py +193 -186
  71. pyxllib/file/specialist/filelib.py +2829 -2618
  72. pyxllib/file/xlsxlib.py +3131 -2976
  73. pyxllib/file/xlsyncfile.py +341 -0
  74. pyxllib/prog/__init__.py +5 -5
  75. pyxllib/prog/cachetools.py +64 -0
  76. pyxllib/prog/deprecatedlib.py +233 -233
  77. pyxllib/prog/filelock.py +42 -0
  78. pyxllib/prog/ipyexec.py +253 -253
  79. pyxllib/prog/multiprogs.py +940 -0
  80. pyxllib/prog/newbie.py +451 -444
  81. pyxllib/prog/pupil.py +1197 -1128
  82. pyxllib/prog/sitepackages.py +33 -33
  83. pyxllib/prog/specialist/__init__.py +391 -217
  84. pyxllib/prog/specialist/bc.py +203 -200
  85. pyxllib/prog/specialist/browser.py +497 -488
  86. pyxllib/prog/specialist/common.py +347 -347
  87. pyxllib/prog/specialist/datetime.py +199 -131
  88. pyxllib/prog/specialist/tictoc.py +240 -241
  89. pyxllib/prog/specialist/xllog.py +180 -180
  90. pyxllib/prog/xlosenv.py +108 -101
  91. pyxllib/stdlib/__init__.py +17 -17
  92. pyxllib/stdlib/tablepyxl/__init__.py +10 -10
  93. pyxllib/stdlib/tablepyxl/style.py +303 -303
  94. pyxllib/stdlib/tablepyxl/tablepyxl.py +130 -130
  95. pyxllib/text/__init__.py +8 -8
  96. pyxllib/text/ahocorasick.py +39 -39
  97. pyxllib/text/airscript.js +744 -0
  98. pyxllib/text/charclasslib.py +121 -109
  99. pyxllib/text/jiebalib.py +267 -264
  100. pyxllib/text/jinjalib.py +32 -0
  101. pyxllib/text/jsa_ai_prompt.md +271 -0
  102. pyxllib/text/jscode.py +922 -767
  103. pyxllib/text/latex/__init__.py +158 -158
  104. pyxllib/text/levenshtein.py +303 -303
  105. pyxllib/text/nestenv.py +1215 -1215
  106. pyxllib/text/newbie.py +300 -288
  107. pyxllib/text/pupil/__init__.py +8 -8
  108. pyxllib/text/pupil/common.py +1121 -1095
  109. pyxllib/text/pupil/xlalign.py +326 -326
  110. pyxllib/text/pycode.py +47 -47
  111. pyxllib/text/specialist/__init__.py +8 -8
  112. pyxllib/text/specialist/common.py +112 -112
  113. pyxllib/text/specialist/ptag.py +186 -186
  114. pyxllib/text/spellchecker.py +172 -172
  115. pyxllib/text/templates/echart_base.html +11 -0
  116. pyxllib/text/templates/highlight_code.html +17 -0
  117. pyxllib/text/templates/latex_editor.html +103 -0
  118. pyxllib/text/vbacode.py +17 -17
  119. pyxllib/text/xmllib.py +747 -685
  120. pyxllib/xl.py +42 -38
  121. pyxllib/xlcv.py +17 -17
  122. pyxllib-0.3.200.dist-info/METADATA +48 -0
  123. pyxllib-0.3.200.dist-info/RECORD +126 -0
  124. {pyxllib-0.3.96.dist-info → pyxllib-0.3.200.dist-info}/WHEEL +1 -2
  125. {pyxllib-0.3.96.dist-info → pyxllib-0.3.200.dist-info/licenses}/LICENSE +190 -190
  126. pyxllib/ext/autogui/__init__.py +0 -8
  127. pyxllib-0.3.96.dist-info/METADATA +0 -51
  128. pyxllib-0.3.96.dist-info/RECORD +0 -333
  129. pyxllib-0.3.96.dist-info/top_level.txt +0 -2
  130. pyxlpr/ai/__init__.py +0 -5
  131. pyxlpr/ai/clientlib.py +0 -1281
  132. pyxlpr/ai/specialist.py +0 -286
  133. pyxlpr/ai/torch_app.py +0 -172
  134. pyxlpr/ai/xlpaddle.py +0 -655
  135. pyxlpr/ai/xltorch.py +0 -705
  136. pyxlpr/data/__init__.py +0 -11
  137. pyxlpr/data/coco.py +0 -1325
  138. pyxlpr/data/datacls.py +0 -365
  139. pyxlpr/data/datasets.py +0 -200
  140. pyxlpr/data/gptlib.py +0 -1291
  141. pyxlpr/data/icdar/__init__.py +0 -96
  142. pyxlpr/data/icdar/deteval.py +0 -377
  143. pyxlpr/data/icdar/icdar2013.py +0 -341
  144. pyxlpr/data/icdar/iou.py +0 -340
  145. pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -463
  146. pyxlpr/data/imtextline.py +0 -473
  147. pyxlpr/data/labelme.py +0 -866
  148. pyxlpr/data/removeline.py +0 -179
  149. pyxlpr/data/specialist.py +0 -57
  150. pyxlpr/eval/__init__.py +0 -85
  151. pyxlpr/paddleocr.py +0 -776
  152. pyxlpr/ppocr/__init__.py +0 -15
  153. pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -226
  154. pyxlpr/ppocr/data/__init__.py +0 -135
  155. pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -26
  156. pyxlpr/ppocr/data/imaug/__init__.py +0 -67
  157. pyxlpr/ppocr/data/imaug/copy_paste.py +0 -170
  158. pyxlpr/ppocr/data/imaug/east_process.py +0 -437
  159. pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -244
  160. pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -114
  161. pyxlpr/ppocr/data/imaug/label_ops.py +0 -789
  162. pyxlpr/ppocr/data/imaug/make_border_map.py +0 -184
  163. pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -106
  164. pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -126
  165. pyxlpr/ppocr/data/imaug/operators.py +0 -433
  166. pyxlpr/ppocr/data/imaug/pg_process.py +0 -906
  167. pyxlpr/ppocr/data/imaug/randaugment.py +0 -143
  168. pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -239
  169. pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -533
  170. pyxlpr/ppocr/data/imaug/sast_process.py +0 -777
  171. pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -17
  172. pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -120
  173. pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -168
  174. pyxlpr/ppocr/data/lmdb_dataset.py +0 -115
  175. pyxlpr/ppocr/data/pgnet_dataset.py +0 -104
  176. pyxlpr/ppocr/data/pubtab_dataset.py +0 -107
  177. pyxlpr/ppocr/data/simple_dataset.py +0 -372
  178. pyxlpr/ppocr/losses/__init__.py +0 -61
  179. pyxlpr/ppocr/losses/ace_loss.py +0 -52
  180. pyxlpr/ppocr/losses/basic_loss.py +0 -135
  181. pyxlpr/ppocr/losses/center_loss.py +0 -88
  182. pyxlpr/ppocr/losses/cls_loss.py +0 -30
  183. pyxlpr/ppocr/losses/combined_loss.py +0 -67
  184. pyxlpr/ppocr/losses/det_basic_loss.py +0 -208
  185. pyxlpr/ppocr/losses/det_db_loss.py +0 -80
  186. pyxlpr/ppocr/losses/det_east_loss.py +0 -63
  187. pyxlpr/ppocr/losses/det_pse_loss.py +0 -149
  188. pyxlpr/ppocr/losses/det_sast_loss.py +0 -121
  189. pyxlpr/ppocr/losses/distillation_loss.py +0 -272
  190. pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -140
  191. pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -113
  192. pyxlpr/ppocr/losses/rec_aster_loss.py +0 -99
  193. pyxlpr/ppocr/losses/rec_att_loss.py +0 -39
  194. pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -44
  195. pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -70
  196. pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -30
  197. pyxlpr/ppocr/losses/rec_sar_loss.py +0 -28
  198. pyxlpr/ppocr/losses/rec_srn_loss.py +0 -47
  199. pyxlpr/ppocr/losses/table_att_loss.py +0 -109
  200. pyxlpr/ppocr/metrics/__init__.py +0 -44
  201. pyxlpr/ppocr/metrics/cls_metric.py +0 -45
  202. pyxlpr/ppocr/metrics/det_metric.py +0 -82
  203. pyxlpr/ppocr/metrics/distillation_metric.py +0 -73
  204. pyxlpr/ppocr/metrics/e2e_metric.py +0 -86
  205. pyxlpr/ppocr/metrics/eval_det_iou.py +0 -274
  206. pyxlpr/ppocr/metrics/kie_metric.py +0 -70
  207. pyxlpr/ppocr/metrics/rec_metric.py +0 -75
  208. pyxlpr/ppocr/metrics/table_metric.py +0 -50
  209. pyxlpr/ppocr/modeling/architectures/__init__.py +0 -32
  210. pyxlpr/ppocr/modeling/architectures/base_model.py +0 -88
  211. pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -60
  212. pyxlpr/ppocr/modeling/backbones/__init__.py +0 -54
  213. pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -268
  214. pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -246
  215. pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -285
  216. pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -265
  217. pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -186
  218. pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -138
  219. pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -258
  220. pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -48
  221. pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -210
  222. pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -143
  223. pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -307
  224. pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -286
  225. pyxlpr/ppocr/modeling/heads/__init__.py +0 -54
  226. pyxlpr/ppocr/modeling/heads/cls_head.py +0 -52
  227. pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -118
  228. pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -121
  229. pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -37
  230. pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -128
  231. pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -253
  232. pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -206
  233. pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -163
  234. pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -393
  235. pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -202
  236. pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -88
  237. pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -826
  238. pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -402
  239. pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -280
  240. pyxlpr/ppocr/modeling/heads/self_attention.py +0 -406
  241. pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -246
  242. pyxlpr/ppocr/modeling/necks/__init__.py +0 -32
  243. pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -111
  244. pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -188
  245. pyxlpr/ppocr/modeling/necks/fpn.py +0 -138
  246. pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -314
  247. pyxlpr/ppocr/modeling/necks/rnn.py +0 -92
  248. pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -284
  249. pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -110
  250. pyxlpr/ppocr/modeling/transforms/__init__.py +0 -28
  251. pyxlpr/ppocr/modeling/transforms/stn.py +0 -135
  252. pyxlpr/ppocr/modeling/transforms/tps.py +0 -308
  253. pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -156
  254. pyxlpr/ppocr/optimizer/__init__.py +0 -61
  255. pyxlpr/ppocr/optimizer/learning_rate.py +0 -228
  256. pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -49
  257. pyxlpr/ppocr/optimizer/optimizer.py +0 -160
  258. pyxlpr/ppocr/optimizer/regularizer.py +0 -52
  259. pyxlpr/ppocr/postprocess/__init__.py +0 -55
  260. pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -33
  261. pyxlpr/ppocr/postprocess/db_postprocess.py +0 -234
  262. pyxlpr/ppocr/postprocess/east_postprocess.py +0 -143
  263. pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -200
  264. pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -52
  265. pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -15
  266. pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -29
  267. pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -14
  268. pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -118
  269. pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -654
  270. pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -355
  271. pyxlpr/ppocr/tools/__init__.py +0 -14
  272. pyxlpr/ppocr/tools/eval.py +0 -83
  273. pyxlpr/ppocr/tools/export_center.py +0 -77
  274. pyxlpr/ppocr/tools/export_model.py +0 -129
  275. pyxlpr/ppocr/tools/infer/predict_cls.py +0 -151
  276. pyxlpr/ppocr/tools/infer/predict_det.py +0 -300
  277. pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -169
  278. pyxlpr/ppocr/tools/infer/predict_rec.py +0 -414
  279. pyxlpr/ppocr/tools/infer/predict_system.py +0 -204
  280. pyxlpr/ppocr/tools/infer/utility.py +0 -629
  281. pyxlpr/ppocr/tools/infer_cls.py +0 -83
  282. pyxlpr/ppocr/tools/infer_det.py +0 -134
  283. pyxlpr/ppocr/tools/infer_e2e.py +0 -122
  284. pyxlpr/ppocr/tools/infer_kie.py +0 -153
  285. pyxlpr/ppocr/tools/infer_rec.py +0 -146
  286. pyxlpr/ppocr/tools/infer_table.py +0 -107
  287. pyxlpr/ppocr/tools/program.py +0 -596
  288. pyxlpr/ppocr/tools/test_hubserving.py +0 -117
  289. pyxlpr/ppocr/tools/train.py +0 -163
  290. pyxlpr/ppocr/tools/xlprog.py +0 -748
  291. pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -94
  292. pyxlpr/ppocr/utils/__init__.py +0 -24
  293. pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -117
  294. pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -162
  295. pyxlpr/ppocr/utils/dict/be_dict.txt +0 -145
  296. pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -140
  297. pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -8421
  298. pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -163
  299. pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -167
  300. pyxlpr/ppocr/utils/dict/en_dict.txt +0 -63
  301. pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -136
  302. pyxlpr/ppocr/utils/dict/french_dict.txt +0 -136
  303. pyxlpr/ppocr/utils/dict/german_dict.txt +0 -143
  304. pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -162
  305. pyxlpr/ppocr/utils/dict/it_dict.txt +0 -118
  306. pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -4399
  307. pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -153
  308. pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -3688
  309. pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -185
  310. pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -153
  311. pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -153
  312. pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -96
  313. pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -130
  314. pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -91
  315. pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -134
  316. pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -125
  317. pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -128
  318. pyxlpr/ppocr/utils/dict/table_dict.txt +0 -277
  319. pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -2759
  320. pyxlpr/ppocr/utils/dict/te_dict.txt +0 -151
  321. pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -114
  322. pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -142
  323. pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -137
  324. pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -110
  325. pyxlpr/ppocr/utils/dict90.txt +0 -90
  326. pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -574
  327. pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -83
  328. pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -87
  329. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -457
  330. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -592
  331. pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -162
  332. pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -162
  333. pyxlpr/ppocr/utils/en_dict.txt +0 -95
  334. pyxlpr/ppocr/utils/gen_label.py +0 -81
  335. pyxlpr/ppocr/utils/ic15_dict.txt +0 -36
  336. pyxlpr/ppocr/utils/iou.py +0 -54
  337. pyxlpr/ppocr/utils/logging.py +0 -69
  338. pyxlpr/ppocr/utils/network.py +0 -84
  339. pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -6623
  340. pyxlpr/ppocr/utils/profiler.py +0 -110
  341. pyxlpr/ppocr/utils/save_load.py +0 -150
  342. pyxlpr/ppocr/utils/stats.py +0 -72
  343. pyxlpr/ppocr/utils/utility.py +0 -80
  344. pyxlpr/ppstructure/__init__.py +0 -13
  345. pyxlpr/ppstructure/predict_system.py +0 -187
  346. pyxlpr/ppstructure/table/__init__.py +0 -13
  347. pyxlpr/ppstructure/table/eval_table.py +0 -72
  348. pyxlpr/ppstructure/table/matcher.py +0 -192
  349. pyxlpr/ppstructure/table/predict_structure.py +0 -136
  350. pyxlpr/ppstructure/table/predict_table.py +0 -221
  351. pyxlpr/ppstructure/table/table_metric/__init__.py +0 -16
  352. pyxlpr/ppstructure/table/table_metric/parallel.py +0 -51
  353. pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -247
  354. pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -13
  355. pyxlpr/ppstructure/table/tablepyxl/style.py +0 -283
  356. pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -118
  357. pyxlpr/ppstructure/utility.py +0 -71
  358. pyxlpr/xlai.py +0 -10
pyxllib/ext/webhook.py CHANGED
@@ -1,101 +1,124 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2020/10/21 09:22
6
-
7
-
8
- import time
9
- import hmac
10
- import hashlib
11
- import base64
12
- import urllib.parse
13
-
14
- import requests
15
-
16
-
17
- class WeixinRobot:
18
- """ 企业微信 机器人 """
19
-
20
- def __init__(self, url):
21
- self.url = url
22
-
23
- def push_text(self, s):
24
- msgtype = 'text'
25
- try:
26
- headers = {"Content-Type": "text/plain"}
27
- t = {"content": s} if isinstance(s, str) else s
28
- data = {"msgtype": msgtype, msgtype: t} # msgtype: text、markdown
29
- requests.post(url=self.url, headers=headers, json=data)
30
- except requests.exceptions.ConnectionError: # 没网发送失败的时候也不报错
31
- pass
32
-
33
-
34
- class DingtalkRobot:
35
- """ 钉钉 自定义webhook机器人
36
-
37
- https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
38
- """
39
-
40
- def __init__(self, url, secret):
41
- self.base_url = url # 原始url,不包含时间戳和签名
42
- self.secret = secret
43
- 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
-
52
- @classmethod
53
- def add_secret(cls, secret):
54
- """ 钉钉机器人需要加签,确保安全性 """
55
- timestamp = str(round(time.time() * 1000))
56
- secret_enc = secret.encode('utf-8')
57
- string_to_sign = '{}\n{}'.format(timestamp, secret)
58
- string_to_sign_enc = string_to_sign.encode('utf-8')
59
- hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
60
- sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
61
- return f'&timestamp={timestamp}&sign={sign}'
62
-
63
- def send_data(self, data):
64
- # 检查当前时间是否超过30分钟
65
- if round(time.time()) - self.last_timestamp > 1800: # 30 * 60
66
- self.update_url() # 更新URL
67
- try:
68
- requests.post(url=self.url, headers=self.headers, json=data)
69
- except requests.exceptions.ConnectionError as e: # 没网发送失败的时候也不报错
70
- raise e
71
-
72
- def send_text(self, content):
73
- msgtype = 'text'
74
- d = {}
75
- if content: d['content'] = content
76
- data = {"msgtype": msgtype, msgtype: d}
77
- self.send_data(data)
78
-
79
- def send_link(self, text='', title='', pic_url='', message_url=''):
80
- msgtype = 'link'
81
- d = {}
82
- if text: d['text'] = text
83
- if title: d['title'] = title
84
- if pic_url: d['picUrl'] = pic_url
85
- if message_url: d['messageUrl'] = message_url
86
- data = {"msgtype": msgtype, msgtype: d}
87
- self.send_data(data)
88
-
89
- def send_markdown(self, text='', title=''):
90
- msgtype = 'link'
91
- d = {}
92
- if text: d['text'] = text
93
- if title: d['title'] = title
94
- data = {"msgtype": msgtype, msgtype: d}
95
- self.send_data(data)
96
-
97
- def send_actioncard(self, text='', title='', siggle_url='', siggle_title='', btn_orientation='0'):
98
- raise NotImplementedError
99
-
100
- def send_feedcard(self):
101
- raise NotImplementedError
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2020/10/21 09:22
6
+
7
+ import os
8
+ import time
9
+ import hmac
10
+ import hashlib
11
+ import base64
12
+ import urllib.parse
13
+
14
+ import requests
15
+
16
+
17
+ class WeixinRobot:
18
+ """ 企业微信 机器人 """
19
+
20
+ def __init__(self, url):
21
+ self.url = url
22
+
23
+ def push_text(self, s):
24
+ msgtype = 'text'
25
+ try:
26
+ headers = {"Content-Type": "text/plain"}
27
+ t = {"content": s} if isinstance(s, str) else s
28
+ data = {"msgtype": msgtype, msgtype: t} # msgtype: text、markdown
29
+ requests.post(url=self.url, headers=headers, json=data)
30
+ except requests.exceptions.ConnectionError: # 没网发送失败的时候也不报错
31
+ pass
32
+
33
+
34
+ class DingtalkRobot:
35
+ """ 钉钉 自定义webhook机器人
36
+
37
+ https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
38
+ """
39
+
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'))
44
+ self.headers = {"Content-Type": "application/json"}
45
+
46
+ @classmethod
47
+ def add_secret(cls, secret):
48
+ """ 钉钉机器人需要加签,确保安全性 """
49
+ timestamp = str(round(time.time() * 1000))
50
+ secret_enc = secret.encode('utf-8')
51
+ string_to_sign = '{}\n{}'.format(timestamp, secret)
52
+ string_to_sign_enc = string_to_sign.encode('utf-8')
53
+ hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
54
+ sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
55
+ return f'&timestamp={timestamp}&sign={sign}'
56
+
57
+ def send_data(self, data):
58
+ try:
59
+ requests.post(url=self.url, headers=self.headers, json=data)
60
+ except requests.exceptions.ConnectionError as e: # 没网发送失败的时候也不报错
61
+ raise e
62
+
63
+ def send_text(self, content):
64
+ msgtype = 'text'
65
+ d = {}
66
+ if content: d['content'] = content
67
+ data = {"msgtype": msgtype, msgtype: d}
68
+ self.send_data(data)
69
+
70
+ def send_link(self, text='', title='', pic_url='', message_url=''):
71
+ msgtype = 'link'
72
+ d = {}
73
+ if text: d['text'] = text
74
+ if title: d['title'] = title
75
+ if pic_url: d['picUrl'] = pic_url
76
+ if message_url: d['messageUrl'] = message_url
77
+ data = {"msgtype": msgtype, msgtype: d}
78
+ self.send_data(data)
79
+
80
+ def send_markdown(self, text='', title=''):
81
+ msgtype = 'link'
82
+ d = {}
83
+ if text: d['text'] = text
84
+ if title: d['title'] = title
85
+ data = {"msgtype": msgtype, msgtype: d}
86
+ self.send_data(data)
87
+
88
+ def send_actioncard(self, text='', title='', siggle_url='', siggle_title='', btn_orientation='0'):
89
+ raise NotImplementedError
90
+
91
+ def send_feedcard(self):
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)}')
120
+
121
+ if __name__ == '__main__':
122
+ pass
123
+
124
+ from pyxllib.prog.newbie import typename
pyxllib/ext/win32lib.py CHANGED
@@ -1,40 +1,40 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2021/09/07 10:21
6
-
7
-
8
- import win32com.client as win32
9
- import pythoncom
10
-
11
-
12
- def get_win32_app(name, visible=False):
13
- """ 启动可支持pywin32自动化处理的应用
14
-
15
- Args:
16
- str name: 应用名称,不区分大小写,比如word, excel, powerpoint, onenote
17
- 不带'.'的情况下,会自动添加'.Application'的后缀
18
- visible: 应用是否可见
19
-
20
- Returns: app
21
-
22
- """
23
- # 1 name
24
- name = name.lower()
25
- if '.' not in name:
26
- name += '.application'
27
-
28
- # 2 app
29
- # 这里可能还有些问题,不同的应用,机制不太一样,后面再细化完善吧
30
- try:
31
- app = win32.GetActiveObject(f'{name}') # 不能关联到普通方式打开的应用。但代码打开的应用都能找得到。
32
- except pythoncom.com_error:
33
- app = win32.gencache.EnsureDispatch(f'{name}')
34
- # 还有种常见的初始化方法,是 win32com.client.Dispatch和win32com.client.dynamic.Dispatch
35
- # from win32com.client.dynamic import Disypatch
36
-
37
- if visible is not None:
38
- app.Visible = visible
39
-
40
- return app
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2021/09/07 10:21
6
+
7
+
8
+ import win32com.client as win32
9
+ import pythoncom
10
+
11
+
12
+ def get_win32_app(name, visible=False):
13
+ """ 启动可支持pywin32自动化处理的应用
14
+
15
+ Args:
16
+ str name: 应用名称,不区分大小写,比如word, excel, powerpoint, onenote
17
+ 不带'.'的情况下,会自动添加'.Application'的后缀
18
+ visible: 应用是否可见
19
+
20
+ Returns: app
21
+
22
+ """
23
+ # 1 name
24
+ name = name.lower()
25
+ if '.' not in name:
26
+ name += '.application'
27
+
28
+ # 2 app
29
+ # 这里可能还有些问题,不同的应用,机制不太一样,后面再细化完善吧
30
+ try:
31
+ app = win32.GetActiveObject(f'{name}') # 不能关联到普通方式打开的应用。但代码打开的应用都能找得到。
32
+ except pythoncom.com_error:
33
+ app = win32.gencache.EnsureDispatch(f'{name}')
34
+ # 还有种常见的初始化方法,是 win32com.client.Dispatch和win32com.client.dynamic.Dispatch
35
+ # from win32com.client.dynamic import Disypatch
36
+
37
+ if visible is not None:
38
+ app.Visible = visible
39
+
40
+ return app
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
+