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/utools.py CHANGED
@@ -1,338 +1,351 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2021/04/04 17:03
6
-
7
- """ 专门给utools的快捷命令扩展的一系列python工具库
8
- """
9
- from pyxllib.prog.pupil import check_install_package
10
-
11
- check_install_package('fire')
12
- check_install_package('humanfriendly')
13
- check_install_package('pandas')
14
- check_install_package('pyautogui', 'PyAutoGui') # 其实pip install不区分大小写,不过官方这里安装是驼峰名
15
-
16
- import datetime
17
- import json
18
- import os
19
- import pathlib
20
- import pyperclip
21
- import re
22
-
23
- import fire
24
- from humanfriendly import format_timespan
25
- import pandas as pd
26
- import pyautogui
27
-
28
- from pyxllib.prog.specialist import browser, TicToc, parse_datetime
29
- from pyxllib.file.specialist import XlPath
30
- from pyxllib.ext.autogui import type_text, clipboard_decorator
31
-
32
-
33
- def _print_df_result(df, outfmt='text'):
34
- # subinput可以强制重置输出类型
35
- # TODO argparser可以对str类型进行参数解析?
36
- # if 'browser' in kwargs['subinput']:
37
- # outfmt = 'browser'
38
- # elif 'html' in kwargs['subinput']:
39
- # outfmt = 'html'
40
- # elif 'text' in kwargs['subinput']:
41
- # outfmt = 'text'
42
-
43
- if outfmt == 'html':
44
- # content = df.to_html().replace('–', '-') # 很多app会出现一个utf8特殊的-,转gbk编码会出错+
45
- try: # utools里按gbk会有很多编码问题,如果不能直接显示,就打开浏览器看
46
- print(df.to_html())
47
- except UnicodeEncodeError:
48
- browser(df)
49
- elif outfmt == 'browser':
50
- browser(df)
51
- else:
52
- with pd.option_context('display.max_colwidth', -1, 'display.max_columns', 20,
53
- 'display.width', 200): # 上下文控制格式
54
- print(df)
55
-
56
-
57
- class UtoolsBase:
58
- def __init__(self, cmds, *, outfmt='text'):
59
- """
60
- :param cmds: "快捷命令"响应的命令集,即调用出可传入的输入文件、所在窗口、选中文件等信息
61
- :param outfmt: 输出格式
62
- text,纯文本
63
- html,html格式
64
- browser,用浏览器打开
65
- """
66
- # 1 删除没有值的键
67
- self.cmds = dict()
68
- for k, v in cmds.items():
69
- if cmds[k] not in ('{{' + k + '}}', ''):
70
- self.cmds[k] = v
71
-
72
- # 2 「快捷命令」的ClipText宏展开,如果存在连续3个单引号,会跟py字符串定义冲突,产生bug
73
- # 所以这段不建议用宏展开,这里该类会自动调用pyperclip获取
74
- # 这个可以作为可选功能关闭,但实验证明这个对性能其实没有太大影响
75
- if 'ClipText' not in self.cmds:
76
- self.cmds['ClipText'] = pyperclip.paste().replace('\r\n', '\n')
77
-
78
- # 3 解析json数据
79
- # 解析window模式的WindowInfo
80
- if 'WindowInfo' in self.cmds:
81
- self.cmds['WindowInfo'] = json.loads(self.cmds['WindowInfo'].encode('utf8'))
82
-
83
- # 解析files模式的MatchedFiles
84
- if 'MatchedFiles' in self.cmds:
85
- # 右边引用没写错。因为MatchedFiles本身获取内容不稳定,可能会有bug,取更稳定的payload来初始化MatchedFiles
86
- self.cmds['MatchedFiles'] = json.loads(self.cmds['payload'].encode('utf8'))
87
- # 在有些软件中,比如everything,是可以选中多个不同目录的文件的。。。所以严格来说不能直接按第一个文件算pwd
88
- # 但这个讯息是可以写一个工具分析的
89
- # self.cmds['pwd'] = os.path.dirname(self.cmds['MatchedFiles'][0]['path'])
90
-
91
- # TODO 如果选中的文件全部是同一个目录下的,要存储pwd
92
- dirs = {os.path.dirname(f['path']) for f in self.cmds['MatchedFiles']}
93
- if len(dirs) == 1:
94
- self.cmds['pwd'] = list(dirs)[0]
95
-
96
- # 4 当前工作目录
97
- # 要根据场景切换pwd
98
- # files默认工作目录是app: C:\Users\chen\AppData\Local\Programs\utools
99
- # window默认工作目录是exe
100
- # window模式存储的pwd跟各种软件有关
101
- # explorer就是当前窗口,没问题
102
- # onenote存的是桌面
103
- if 'pwd' in self.cmds:
104
- os.chdir(self.cmds['pwd'])
105
-
106
- # 5 subinput可以用字典结构扩展参数
107
- if 'subinput' in self.cmds:
108
- if re.match(r'\{.+\}$', self.cmds['subinput']):
109
- ext_kwargs = eval(self.cmds['subinput'])
110
- self.cmds.update(ext_kwargs)
111
- else:
112
- self.cmds['subinput'] = ''
113
-
114
- self.outfmt = self.cmds['outfmt'] if 'outfmt' in self.cmds else outfmt
115
-
116
- def check_cmds(self):
117
- """ 显示所有参数值 """
118
- df = pd.DataFrame.from_records([(k, v) for k, v in self.cmds.items()],
119
- columns=['key', 'content'])
120
- _print_df_result(df, self.outfmt)
121
-
122
- def bcompare(self):
123
- """ 可以通过subinput设置文件后缀类型 """
124
- from pyxllib.prog.specialist import bcompare
125
-
126
- suffix = self.cmds.get('subinput', None)
127
- try:
128
- f1 = XlPath.init('left', XlPath.tempdir(), suffix=suffix)
129
- f2 = XlPath.init('right', XlPath.tempdir(), suffix=suffix)
130
- except OSError: # 忽略错误的扩展名
131
- f1 = XlPath.init('left', XlPath.tempdir())
132
- f2 = XlPath.init('right', XlPath.tempdir())
133
- f1.write_text(suffix)
134
- f2.write_text(self.cmds['ClipText'])
135
- bcompare(f1, f2, wait=False)
136
-
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
- @clipboard_decorator(copy=False, typing=True)
229
- def common_dir(self):
230
- # 目录路径生成工具
231
- from pyxlpr.data.datasets import common_path
232
-
233
- def func(name, unix_path=False):
234
- p = getattr(common_path, name)
235
-
236
- if unix_path:
237
- # 因为用了符号链接,实际位置会变回D:/slns,这里需要反向替换下
238
- p = str(p).replace('D:/slns', 'D:/home/chenkunze/slns')
239
- p = str(p)[2:]
240
- else:
241
- # slns比较特别,本地要重定向到D:/slns
242
- p = str(p).replace('D:/home/chenkunze/slns', 'D:/slns')
243
- p = p.replace('/', '\\')
244
-
245
- return p
246
-
247
- return fire.Fire(func, self.cmds['subinput'], 'CommonDir')
248
-
249
- def wdate(self):
250
- """ week dates 输入一周的简略日期值 """
251
-
252
- def func(start):
253
- weektag = '一二三四五六日'
254
- for i in range(7):
255
- dt = parse_datetime(start) + datetime.timedelta(i)
256
- type_text(dt.strftime('%y%m%d') + f'周{weektag[dt.weekday()]}')
257
- pyautogui.press('down')
258
-
259
- fire.Fire(func, self.cmds['subinput'], 'wdate')
260
-
261
- def input_digits(self):
262
- """ 输入数字 """
263
-
264
- def func(start, stop, step=1):
265
- for i in range(start, stop, step):
266
- pyautogui.write(str(i))
267
- pyautogui.press('down')
268
-
269
- fire.Fire(func, self.cmds['subinput'], 'input_digits')
270
-
271
- def __win32(self):
272
- """ win32相关自动化
273
-
274
- 目前主要是word自动化相关的功能,这里有很多demo可以学习怎么用win32做word的自动化
275
- """
276
- pass
277
-
278
- def browser(self):
279
- """ 将内容复制到word,另存为html文件后,用浏览器打开查看 """
280
- from pyxllib.file.docxlib import rebuild_document_by_word
281
-
282
- file = fire.Fire(rebuild_document_by_word, self.cmds['subinput'], 'browser')
283
- browser(file)
284
-
285
- def create_text_image(self):
286
- from pyxllib.xl import XlPath
287
- from pyxllib.xlcv import xlpil, create_text_image
288
-
289
- @clipboard_decorator('html')
290
- def func(text, font_size=20, *, size=None, xy=None, bg_color=None, text_color=None):
291
- im = create_text_image(text, size, xy=xy, font_size=font_size, bg_color=bg_color, text_color=text_color)
292
- # 这种只能语雀里用
293
- data = xlpil.to_buffer(im, b64encode=True).decode()
294
- res = '<img src="data:image/jpg;base64,' + data + '"/>'
295
- # 这种只能onenote、qq、微信里用
296
- p = XlPath.tempdir() / 'create_text_image.jpg'
297
- im.save(p)
298
- res += f'<img src="{p}"/>'
299
- # 那么我把两种都复制,就能兼容多种场景了~~
300
- return res
301
-
302
- fire.Fire(func, self.cmds['subinput'], 'create_text_image')
303
-
304
-
305
- class UtoolsRegex(UtoolsBase):
306
- def __init__(self, cmds, *, outfmt='text'):
307
- super().__init__(cmds, outfmt=outfmt)
308
-
309
- @clipboard_decorator(paste=True)
310
- def coderegex(self):
311
- # tt = TicToc()
312
- s = self.cmds['ClipText']
313
- return eval(self.cmds['subinput'])
314
- # print(f'finished in {format_timespan(tt.tocvalue())}.')
315
-
316
- def refine_text(self, func, rtype='text', *, copy=True, paste=True, typing=False):
317
- from functools import partial
318
-
319
- @clipboard_decorator(rtype=rtype, copy=copy, paste=paste, typing=typing)
320
- def _refine():
321
- return fire.Fire(partial(func, self.cmds['ClipText']),
322
- self.cmds['subinput'], func.__name__)
323
-
324
- return _refine()
325
-
326
- def bc_text(self, func):
327
- """ 用bc软件打开,对比前后文本变化,有用户自己决定如何处理保留 """
328
- from functools import partial
329
- from pyxllib.prog.specialist import bcompare
330
-
331
- text1 = self.cmds['ClipText']
332
- text2 = fire.Fire(partial(func, text1), self.cmds['subinput'], func.__name__)
333
- bcompare(text1, text2)
334
-
335
-
336
- if __name__ == '__main__':
337
- with TicToc('utools'):
338
- pass
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2021/04/04 17:03
6
+
7
+ """ 专门给utools的快捷命令扩展的一系列python工具库
8
+ """
9
+ from pyxllib.prog.pupil import check_install_package
10
+
11
+ check_install_package('fire')
12
+ check_install_package('humanfriendly')
13
+ check_install_package('pandas')
14
+ check_install_package('pyautogui', 'PyAutoGui') # 其实pip install不区分大小写,不过官方这里安装是驼峰名
15
+
16
+ import datetime
17
+ import json
18
+ import os
19
+ import pathlib
20
+ import pyperclip
21
+ import re
22
+
23
+ import fire
24
+ from humanfriendly import format_timespan
25
+ import pandas as pd
26
+ import pyautogui
27
+
28
+ from pyxllib.prog.specialist import browser, TicToc, parse_datetime
29
+ from pyxllib.file.specialist import XlPath
30
+ from pyxllib.autogui.autogui import type_text, clipboard_decorator
31
+
32
+
33
+ def _print_df_result(df, outfmt='text'):
34
+ # subinput可以强制重置输出类型
35
+ # TODO argparser可以对str类型进行参数解析?
36
+ # if 'browser' in kwargs['subinput']:
37
+ # outfmt = 'browser'
38
+ # elif 'html' in kwargs['subinput']:
39
+ # outfmt = 'html'
40
+ # elif 'text' in kwargs['subinput']:
41
+ # outfmt = 'text'
42
+
43
+ if outfmt == 'html':
44
+ # content = df.to_html().replace('–', '-') # 很多app会出现一个utf8特殊的-,转gbk编码会出错+
45
+ try: # utools里按gbk会有很多编码问题,如果不能直接显示,就打开浏览器看
46
+ print(df.to_html())
47
+ except UnicodeEncodeError:
48
+ browser(df)
49
+ elif outfmt == 'browser':
50
+ browser(df)
51
+ else:
52
+ with pd.option_context('display.max_colwidth', -1, 'display.max_columns', 20,
53
+ 'display.width', 200): # 上下文控制格式
54
+ print(df)
55
+
56
+
57
+ class UtoolsBase:
58
+ def __init__(self, cmds, *, outfmt='text'):
59
+ """
60
+ :param cmds: "快捷命令"响应的命令集,即调用出可传入的输入文件、所在窗口、选中文件等信息
61
+ :param outfmt: 输出格式
62
+ text,纯文本
63
+ html,html格式
64
+ browser,用浏览器打开
65
+ """
66
+ # 1 删除没有值的键
67
+ self.cmds = dict()
68
+ for k, v in cmds.items():
69
+ if cmds[k] not in ('{{' + k + '}}', ''):
70
+ self.cmds[k] = v
71
+
72
+ # 2 「快捷命令」的ClipText宏展开,如果存在连续3个单引号,会跟py字符串定义冲突,产生bug
73
+ # 所以这段不建议用宏展开,这里该类会自动调用pyperclip获取
74
+ # 这个可以作为可选功能关闭,但实验证明这个对性能其实没有太大影响
75
+ if 'ClipText' not in self.cmds:
76
+ self.cmds['ClipText'] = pyperclip.paste().replace('\r\n', '\n')
77
+
78
+ # 3 解析json数据
79
+ # 解析window模式的WindowInfo
80
+ if 'WindowInfo' in self.cmds:
81
+ self.cmds['WindowInfo'] = json.loads(self.cmds['WindowInfo'].encode('utf8'))
82
+
83
+ # 解析files模式的MatchedFiles
84
+ if 'MatchedFiles' in self.cmds:
85
+ # 右边引用没写错。因为MatchedFiles本身获取内容不稳定,可能会有bug,取更稳定的payload来初始化MatchedFiles
86
+ self.cmds['MatchedFiles'] = json.loads(self.cmds['payload'].encode('utf8'))
87
+ # 在有些软件中,比如everything,是可以选中多个不同目录的文件的。。。所以严格来说不能直接按第一个文件算pwd
88
+ # 但这个讯息是可以写一个工具分析的
89
+ # self.cmds['pwd'] = os.path.dirname(self.cmds['MatchedFiles'][0]['path'])
90
+
91
+ # TODO 如果选中的文件全部是同一个目录下的,要存储pwd
92
+ dirs = {os.path.dirname(f['path']) for f in self.cmds['MatchedFiles']}
93
+ if len(dirs) == 1:
94
+ self.cmds['pwd'] = list(dirs)[0]
95
+
96
+ # 4 当前工作目录
97
+ # 要根据场景切换pwd
98
+ # files默认工作目录是app: C:\Users\chen\AppData\Local\Programs\utools
99
+ # window默认工作目录是exe
100
+ # window模式存储的pwd跟各种软件有关
101
+ # explorer就是当前窗口,没问题
102
+ # onenote存的是桌面
103
+ if 'pwd' in self.cmds:
104
+ os.chdir(self.cmds['pwd'])
105
+
106
+ # 5 subinput可以用字典结构扩展参数
107
+ if 'subinput' in self.cmds:
108
+ if re.match(r'\{.+\}$', self.cmds['subinput']):
109
+ ext_kwargs = eval(self.cmds['subinput'])
110
+ self.cmds.update(ext_kwargs)
111
+ else:
112
+ self.cmds['subinput'] = ''
113
+
114
+ self.outfmt = self.cmds['outfmt'] if 'outfmt' in self.cmds else outfmt
115
+
116
+
117
+ class UtoolsName(UtoolsBase):
118
+
119
+ def check_cmds(self):
120
+ """ 显示所有参数值 """
121
+ df = pd.DataFrame.from_records([(k, v) for k, v in self.cmds.items()],
122
+ columns=['key', 'content'])
123
+ _print_df_result(df, self.outfmt)
124
+
125
+ def bcompare(self):
126
+ """ 可以通过subinput设置文件后缀类型 """
127
+ from pyxllib.prog.specialist import bcompare
128
+
129
+ suffix = self.cmds.get('subinput', None)
130
+ try:
131
+ f1 = XlPath.init('left', XlPath.tempdir(), suffix=suffix)
132
+ f2 = XlPath.init('right', XlPath.tempdir(), suffix=suffix)
133
+ except OSError: # 忽略错误的扩展名
134
+ f1 = XlPath.init('left', XlPath.tempdir())
135
+ f2 = XlPath.init('right', XlPath.tempdir())
136
+ f1.write_text(self.cmds['ClipText'])
137
+ f2.write_text(self.cmds['ClipText'] + '\n')
138
+ bcompare(f1, f2, wait=False)
139
+
140
+ @clipboard_decorator(copy=False, typing=True)
141
+ def common_dir(self):
142
+ # 目录路径生成工具
143
+ from pyxlpr.data.datasets import common_path
144
+
145
+ def func(name, unix_path=False):
146
+ p = getattr(common_path, name)
147
+
148
+ if unix_path:
149
+ # 因为用了符号链接,实际位置会变回D:/slns,这里需要反向替换下
150
+ p = str(p).replace('D:/slns', 'D:/home/chenkunze/slns')
151
+ p = str(p)[2:]
152
+ else:
153
+ # slns比较特别,本地要重定向到D:/slns
154
+ p = str(p).replace('D:/home/chenkunze/slns', 'D:/slns')
155
+ p = p.replace('/', '\\')
156
+
157
+ return p
158
+
159
+ return fire.Fire(func, self.cmds['subinput'], 'CommonDir')
160
+
161
+ def wdate(self):
162
+ """ week dates 输入一周的简略日期值 """
163
+
164
+ def func(start):
165
+ weektag = '一二三四五六日'
166
+ for i in range(7):
167
+ dt = parse_datetime(start) + datetime.timedelta(i)
168
+ type_text(dt.strftime('%y%m%d') + f'周{weektag[dt.weekday()]}')
169
+ pyautogui.press('down')
170
+
171
+ fire.Fire(func, self.cmds['subinput'], 'wdate')
172
+
173
+ def input_digits(self):
174
+ """ 输入数字 """
175
+
176
+ def func(start, stop, step=1):
177
+ for i in range(start, stop, step):
178
+ pyautogui.write(str(i))
179
+ pyautogui.press('down')
180
+
181
+ fire.Fire(func, self.cmds['subinput'], 'input_digits')
182
+
183
+ def __win32(self):
184
+ """ win32相关自动化
185
+
186
+ 目前主要是word自动化相关的功能,这里有很多demo可以学习怎么用win32做word的自动化
187
+ """
188
+ pass
189
+
190
+ def browser(self):
191
+ """ 将内容复制到word,另存为html文件后,用浏览器打开查看 """
192
+ from pyxllib.file.docxlib import rebuild_document_by_word
193
+
194
+ file = fire.Fire(rebuild_document_by_word, self.cmds['subinput'], 'browser')
195
+ browser(file)
196
+
197
+ def create_text_image(self):
198
+ from pyxllib.xl import XlPath
199
+ from pyxllib.xlcv import xlpil, create_text_image
200
+
201
+ @clipboard_decorator('html')
202
+ def func(text, font_size=20, *, size=None, xy=None, bg_color=None, text_color=None):
203
+ im = create_text_image(text, size, xy=xy, font_size=font_size, bg_color=bg_color, text_color=text_color)
204
+ # 这种只能语雀里用
205
+ data = xlpil.to_buffer(im, b64encode=True).decode()
206
+ res = '<img src="data:image/jpg;base64,' + data + '"/>'
207
+ # 这种只能onenote、qq、微信里用
208
+ p = XlPath.tempdir() / 'create_text_image.jpg'
209
+ im.save(p)
210
+ res += f'<img src="{p}"/>'
211
+ # 那么我把两种都复制,就能兼容多种场景了~~
212
+ return res
213
+
214
+ fire.Fire(func, self.cmds['subinput'], 'create_text_image')
215
+
216
+
217
+ class UtoolsText(UtoolsBase):
218
+ def __init__(self, cmds, *, outfmt='text'):
219
+ super().__init__(cmds, outfmt=outfmt)
220
+
221
+ @clipboard_decorator(paste=True)
222
+ def coderegex(self):
223
+ # tt = TicToc()
224
+ s = self.cmds['ClipText']
225
+ return eval(self.cmds['subinput'])
226
+ # print(f'finished in {format_timespan(tt.tocvalue())}.')
227
+
228
+ def refine_text(self, func, rtype='text', *, copy=True, paste=True, typing=False):
229
+ from functools import partial
230
+
231
+ @clipboard_decorator(rtype=rtype, copy=copy, paste=paste, typing=typing)
232
+ def _refine():
233
+ return fire.Fire(partial(func, self.cmds['ClipText']),
234
+ self.cmds['subinput'], func.__name__)
235
+
236
+ return _refine()
237
+
238
+ def bc_text(self, func):
239
+ """ 用bc软件打开,对比前后文本变化,有用户自己决定如何处理保留 """
240
+ from functools import partial
241
+ from pyxllib.prog.specialist import bcompare
242
+
243
+ text1 = self.cmds['ClipText']
244
+ text2 = fire.Fire(partial(func, text1), self.cmds['subinput'], func.__name__)
245
+ bcompare(text1, text2)
246
+
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
+
349
+ if __name__ == '__main__':
350
+ with TicToc('utools'):
351
+ pass