pyxllib 0.3.84__tar.gz → 0.3.86__tar.gz

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 (339) hide show
  1. {pyxllib-0.3.84/pyxllib.egg-info → pyxllib-0.3.86}/PKG-INFO +1 -1
  2. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/pupil.py +22 -14
  3. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/stat.py +4 -4
  4. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/echarts.py +14 -16
  5. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/pglib.py +3 -4
  6. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/sqlite.py +73 -9
  7. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/specialist/filelib.py +116 -9
  8. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/xlsxlib.py +417 -172
  9. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/newbie.py +29 -13
  10. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/pupil.py +26 -0
  11. pyxllib-0.3.86/pyxllib/text/charclasslib.py +109 -0
  12. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/newbie.py +0 -22
  13. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/pupil/common.py +2 -2
  14. {pyxllib-0.3.84 → pyxllib-0.3.86/pyxllib.egg-info}/PKG-INFO +1 -1
  15. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib.egg-info/SOURCES.txt +1 -0
  16. {pyxllib-0.3.84 → pyxllib-0.3.86}/setup.py +1 -1
  17. {pyxllib-0.3.84 → pyxllib-0.3.86}/LICENSE +0 -0
  18. {pyxllib-0.3.84 → pyxllib-0.3.86}/MANIFEST.in +0 -0
  19. {pyxllib-0.3.84 → pyxllib-0.3.86}/README.md +0 -0
  20. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/__init__.py +0 -0
  21. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/__init__.py +0 -0
  22. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/disjoint.py +0 -0
  23. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/geo.py +0 -0
  24. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/intervals.py +0 -0
  25. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/matcher.py +0 -0
  26. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/newbie.py +0 -0
  27. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/shapelylib.py +0 -0
  28. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/specialist.py +0 -0
  29. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/treelib.py +0 -0
  30. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/algo/unitlib.py +0 -0
  31. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/__init__.py +0 -0
  32. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/expert.py +0 -0
  33. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/imfile.py +0 -0
  34. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/imhash.py +0 -0
  35. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/pupil.py +0 -0
  36. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/rgbfmt.py +0 -0
  37. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/trackbartools.py +0 -0
  38. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/xlcvlib.py +0 -0
  39. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/cv/xlpillib.py +0 -0
  40. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/__init__.py +0 -0
  41. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/oss.py +0 -0
  42. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/data/sqllib.py +0 -0
  43. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/JLineViewer.py +0 -0
  44. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/__init__.py +0 -0
  45. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/autogui/__init__.py +0 -0
  46. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/autogui/autogui.py +0 -0
  47. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/autogui/virtualkey.py +0 -0
  48. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/demolib.py +0 -0
  49. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/kq5034lib.py +0 -0
  50. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/old.py +0 -0
  51. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/qt.py +0 -0
  52. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/seleniumlib.py +0 -0
  53. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/tk.py +0 -0
  54. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/unixlib.py +0 -0
  55. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/utools.py +0 -0
  56. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/webhook.py +0 -0
  57. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/ext/win32lib.py +0 -0
  58. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/__init__.py +0 -0
  59. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/docxlib.py +0 -0
  60. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/gitlib.py +0 -0
  61. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/movielib.py +0 -0
  62. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/newbie.py +0 -0
  63. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/onenotelib.py +0 -0
  64. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/packlib/__init__.py +0 -0
  65. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/packlib/zipfile.py +0 -0
  66. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/pdflib.py +0 -0
  67. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/pupil.py +0 -0
  68. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/specialist/__init__.py +0 -0
  69. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/specialist/dirlib.py +0 -0
  70. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/file/specialist/download.py +0 -0
  71. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/__init__.py +0 -0
  72. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/deprecatedlib.py +0 -0
  73. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/ipyexec.py +0 -0
  74. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/sitepackages.py +0 -0
  75. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/__init__.py +0 -0
  76. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/bc.py +0 -0
  77. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/browser.py +0 -0
  78. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/common.py +0 -0
  79. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/datetime.py +0 -0
  80. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/tictoc.py +0 -0
  81. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/specialist/xllog.py +0 -0
  82. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/prog/xlosenv.py +0 -0
  83. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/stdlib/__init__.py +0 -0
  84. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
  85. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/stdlib/tablepyxl/style.py +0 -0
  86. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
  87. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/__init__.py +0 -0
  88. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/ahocorasick.py +0 -0
  89. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/jiebalib.py +0 -0
  90. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/jscode.py +0 -0
  91. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/latex/__init__.py +0 -0
  92. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/levenshtein.py +0 -0
  93. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/nestenv.py +0 -0
  94. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/pupil/__init__.py +0 -0
  95. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/pupil/xlalign.py +0 -0
  96. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/pycode.py +0 -0
  97. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/specialist/__init__.py +0 -0
  98. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/specialist/common.py +0 -0
  99. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/specialist/ptag.py +0 -0
  100. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/spellchecker.py +0 -0
  101. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/vbacode.py +0 -0
  102. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/text/xmllib.py +0 -0
  103. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/xl.py +0 -0
  104. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib/xlcv.py +0 -0
  105. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib.egg-info/dependency_links.txt +0 -0
  106. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib.egg-info/requires.txt +5 -5
  107. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxllib.egg-info/top_level.txt +0 -0
  108. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/__init__.py +0 -0
  109. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/__init__.py +0 -0
  110. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/clientlib.py +0 -0
  111. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/specialist.py +0 -0
  112. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/torch_app.py +0 -0
  113. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/xlpaddle.py +0 -0
  114. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ai/xltorch.py +0 -0
  115. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/__init__.py +0 -0
  116. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/coco.py +0 -0
  117. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/datacls.py +0 -0
  118. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/datasets.py +0 -0
  119. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/gptlib.py +0 -0
  120. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/__init__.py +0 -0
  121. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/deteval.py +0 -0
  122. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/icdar2013.py +0 -0
  123. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/iou.py +0 -0
  124. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
  125. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/imtextline.py +0 -0
  126. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/labelme.py +0 -0
  127. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/removeline.py +0 -0
  128. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/data/specialist.py +0 -0
  129. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/eval/__init__.py +0 -0
  130. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/paddleocr.py +0 -0
  131. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/__init__.py +0 -0
  132. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
  133. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/__init__.py +0 -0
  134. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
  135. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
  136. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
  137. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
  138. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
  139. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
  140. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
  141. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
  142. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
  143. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
  144. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
  145. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
  146. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
  147. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
  148. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
  149. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
  150. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
  151. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
  152. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
  153. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
  154. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
  155. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
  156. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
  157. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/__init__.py +0 -0
  158. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
  159. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
  160. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/center_loss.py +0 -0
  161. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
  162. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
  163. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
  164. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
  165. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
  166. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
  167. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
  168. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
  169. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
  170. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
  171. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
  172. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
  173. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
  174. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
  175. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
  176. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
  177. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
  178. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
  179. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/__init__.py +0 -0
  180. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
  181. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
  182. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
  183. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
  184. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
  185. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
  186. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
  187. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
  188. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
  189. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
  190. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
  191. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
  192. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
  193. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
  194. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
  195. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
  196. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
  197. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
  198. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
  199. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
  200. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
  201. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
  202. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
  203. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
  204. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
  205. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
  206. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
  207. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
  208. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
  209. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
  210. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
  211. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
  212. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
  213. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
  214. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
  215. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
  216. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
  217. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
  218. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
  219. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
  220. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
  221. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
  222. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
  223. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
  224. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
  225. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
  226. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
  227. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
  228. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
  229. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
  230. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
  231. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
  232. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
  233. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
  234. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
  235. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
  236. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
  237. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
  238. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
  239. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
  240. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
  241. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
  242. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
  243. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
  244. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
  245. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
  246. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
  247. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
  248. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
  249. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
  250. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/__init__.py +0 -0
  251. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/eval.py +0 -0
  252. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/export_center.py +0 -0
  253. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/export_model.py +0 -0
  254. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
  255. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
  256. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
  257. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
  258. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
  259. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
  260. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
  261. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_det.py +0 -0
  262. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
  263. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
  264. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
  265. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/infer_table.py +0 -0
  266. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/program.py +0 -0
  267. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
  268. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/train.py +0 -0
  269. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/tools/xlprog.py +0 -0
  270. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
  271. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/__init__.py +0 -0
  272. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
  273. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
  274. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
  275. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
  276. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
  277. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
  278. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
  279. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
  280. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
  281. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
  282. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
  283. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
  284. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
  285. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
  286. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
  287. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
  288. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
  289. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
  290. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
  291. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
  292. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
  293. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
  294. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
  295. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
  296. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
  297. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
  298. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
  299. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
  300. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
  301. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
  302. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
  303. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
  304. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/dict90.txt +0 -0
  305. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
  306. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
  307. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
  308. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
  309. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
  310. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
  311. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
  312. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
  313. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/gen_label.py +0 -0
  314. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
  315. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/iou.py +0 -0
  316. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/logging.py +0 -0
  317. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/network.py +0 -0
  318. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
  319. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/profiler.py +0 -0
  320. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/save_load.py +0 -0
  321. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/stats.py +0 -0
  322. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppocr/utils/utility.py +0 -0
  323. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/__init__.py +0 -0
  324. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/predict_system.py +0 -0
  325. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/__init__.py +0 -0
  326. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/eval_table.py +0 -0
  327. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/matcher.py +0 -0
  328. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
  329. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/predict_table.py +0 -0
  330. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
  331. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
  332. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
  333. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
  334. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
  335. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
  336. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/ppstructure/utility.py +0 -0
  337. {pyxllib-0.3.84 → pyxllib-0.3.86}/pyxlpr/xlai.py +0 -0
  338. {pyxllib-0.3.84 → pyxllib-0.3.86}/requirements.txt +0 -0
  339. {pyxllib-0.3.84 → pyxllib-0.3.86}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxllib
3
- Version: 0.3.84
3
+ Version: 0.3.86
4
4
  Summary: 厦门理工模式识别团队通用python代码工具库
5
5
  Home-page: https://github.com/XLPRUtils/pyxllib
6
6
  Author: code4101
@@ -10,7 +10,7 @@ import math
10
10
  import re
11
11
  import sys
12
12
 
13
- from pyxllib.prog.newbie import typename
13
+ from pyxllib.prog.newbie import typename, human_readable_number
14
14
  from pyxllib.text.pupil import listalign, int2myalphaenum
15
15
 
16
16
 
@@ -97,7 +97,7 @@ class ValuesStat:
97
97
  def __len__(self):
98
98
  return self.n
99
99
 
100
- def summary(self, valfmt='g'):
100
+ def summary(self, valfmt=lambda x: human_readable_number(x, '', 4)):
101
101
  """ 输出性能分析报告,data是每次运行得到的时间数组
102
102
 
103
103
  :param valfmt: 数值显示的格式
@@ -109,37 +109,45 @@ class ValuesStat:
109
109
  也可以传入长度5的格式清单,表示 [和、均值、标准差、最小值、最大值] 一次展示的格式
110
110
  """
111
111
  if isinstance(valfmt, str) or callable(valfmt):
112
- valfmt = [valfmt] * 5
112
+ valfmt = [valfmt] * 6
113
+
114
+ if len(valfmt) == 5: # 兼容旧版格式化,默认是不填充"总数"的格式化的
115
+ valfmt = [lambda x: x] + valfmt
116
+ assert len(valfmt) == 6, f'valfmt长度必须是6,现在是{len(valfmt)}'
113
117
 
114
118
  ls = []
115
119
 
116
- def format_value(value, format_spec):
120
+ def format_value(value, fmt_id):
117
121
  """ 根据指定的格式来格式化值 """
122
+ format_spec = valfmt[fmt_id]
123
+ if format_spec is None:
124
+ return ''
125
+
118
126
  if callable(format_spec):
119
127
  return format_spec(value)
120
128
  else:
121
129
  return f"{value:{format_spec}}"
122
130
 
123
131
  if self.n > 1:
124
- ls.append(f'总数: {self.n}') # 注意输出其实完整是6个值,还有个总数不用控制格式
125
- if valfmt[0]:
126
- ls.append(f'总和: {format_value(self.sum, valfmt[0])}')
127
- if valfmt[1] or valfmt[2]:
128
- mean_str = format_value(self.mean, valfmt[1]) if valfmt[1] else ''
129
- std_str = format_value(self.std, valfmt[2]) if valfmt[2] else ''
132
+ ls.append(f'总数: {format_value(self.n, 0)}') # 注意输出其实完整是6个值,还有个总数不用控制格式
133
+ if valfmt[1]:
134
+ ls.append(f'总和: {format_value(self.sum, 1)}')
135
+ if valfmt[2] or valfmt[3]:
136
+ mean_str = format_value(self.mean, 2)
137
+ std_str = format_value(self.std, 3)
130
138
  if mean_str and std_str:
131
139
  ls.append(f'均值标准差: {mean_str}±{std_str}')
132
140
  elif mean_str:
133
141
  ls.append(f'均值: {mean_str}')
134
142
  elif std_str:
135
143
  ls.append(f'标准差: {std_str}')
136
- if valfmt[3]:
137
- ls.append(f'最小值: {format_value(self.min, valfmt[3])}')
138
144
  if valfmt[4]:
139
- ls.append(f'最大值: {format_value(self.max, valfmt[4])}')
145
+ ls.append(f'最小值: {format_value(self.min, 4)}')
146
+ if valfmt[5]:
147
+ ls.append(f'最大值: {format_value(self.max, 5)}')
140
148
  return '\t'.join(ls)
141
149
  elif self.n == 1:
142
- return format_value(self.sum, valfmt[0] or 'g')
150
+ return format_value(self.sum, valfmt[1] or 'g')
143
151
  else:
144
152
  raise ValueError("无效的数据数量")
145
153
 
@@ -330,7 +330,7 @@ def count_key_combinations(df, col_names, count_col_name='count'):
330
330
  return df2
331
331
 
332
332
 
333
- def pareto_accumulate(weights, accuracy=0.01, *, print_mode=False):
333
+ def pareto_accumulate(weights, accuracy=0.01, *, print_mode=False, value_unit_type='K'):
334
334
  """ 帕累托累计
335
335
 
336
336
  可以用来分析主要出现的权重、频次
@@ -368,9 +368,9 @@ def pareto_accumulate(weights, accuracy=0.01, *, print_mode=False):
368
368
 
369
369
  # 2 结果展示
370
370
  def fmt(p):
371
- from pyxllib.text.newbie import format_big_decimal
372
- ls = [f'{p[0]}it≥{format_big_decimal(p[1])}',
373
- f'{format_big_decimal(p[2])}({p[2] / total_size:.0%})']
371
+ from pyxllib.prog.newbie import human_readable_number
372
+ ls = [f'{human_readable_number(p[0], "万")}条≥{human_readable_number(p[1])}',
373
+ f'{human_readable_number(p[2], value_unit_type)}({p[2] / total_size:.0%})']
374
374
  return ','.join(map(str, ls))
375
375
 
376
376
  total_size = points[-1][2]
@@ -104,27 +104,25 @@ class XlBar(Bar):
104
104
  inject_members(XlBar, Bar)
105
105
 
106
106
 
107
- def get_render_body(chart):
108
- """ 得到渲染后的核心html内容 """
109
- from pyxllib.text.nestenv import NestEnv
110
-
111
- # 1 得到完整的html内容
112
- file = XlPath.tempfile(suffix='.html')
113
- chart.render(path=str(file))
114
- res = file.read_text()
115
- file.delete()
116
-
117
- # 2 得到body核心内容
118
- res = NestEnv(res).xmltag('body', inner=True).string()
119
-
120
- return res
121
-
122
-
123
107
  def render_echart_html(title='Awesome-pyecharts', body=''):
124
108
  from pyxllib.text.xmllib import get_jinja_template
125
109
  return get_jinja_template('echart_base.html').render(title=title, body=body)
126
110
 
127
111
 
112
+ # 绘制帕累托累计图
113
+ def draw_pareto_chart(data, accuracy=0.1, *, title='帕累托累积权重', value_unit_type='K'):
114
+ from pyxllib.algo.stat import pareto_accumulate
115
+ pts, labels = pareto_accumulate(data, accuracy=accuracy, value_unit_type=value_unit_type)
116
+ x = Line()
117
+ x.add_series(title, pts, labels=labels, label={'position': 'right'})
118
+ x.set_global_opts(
119
+ # x轴末尾要故意撑大一些,不然有部分内容会显示不全
120
+ xaxis_opts=opts.AxisOpts(name='条目数', max_=int(float(f'{pts[-1][0]*1.2:.2g}'))),
121
+ yaxis_opts=opts.AxisOpts(name='累积和')
122
+ )
123
+ return x
124
+
125
+
128
126
  if __name__ == '__main__':
129
127
  with TicToc(__name__):
130
128
  pass
@@ -70,7 +70,7 @@ class Connection(psycopg.Connection, SqlBase):
70
70
  """ 【查】表格有哪些字段
71
71
  """
72
72
  cmd = f"SELECT column_name FROM information_schema.columns WHERE table_name='{table_name}'"
73
- return list(self.exec_col(cmd))
73
+ return self.exec2col(cmd)
74
74
 
75
75
  def ensure_column(self, table_name, col_name, *args, comment=None, **kwargs):
76
76
  super(Connection, self).ensure_column(table_name, col_name, *args, **kwargs)
@@ -401,7 +401,7 @@ class XlprDb(Connection):
401
401
  TODO 功能还可以增加:gpu显卡温度、硬盘读写速率检查、网络上传下载带宽
402
402
  """
403
403
  # 1 服务器列表
404
- host_names = list(self.exec_col('SELECT host_name FROM hosts WHERE id > 1 ORDER BY id'))
404
+ host_names = self.exec2col('SELECT host_name FROM hosts WHERE id > 1 ORDER BY id')
405
405
  host_cpu_gb = {h: v for h, v in self.execute('SELECT host_name, cpu_gb FROM hosts')}
406
406
 
407
407
  # 2 去所有服务器取使用情况
@@ -466,7 +466,6 @@ class XlprDb(Connection):
466
466
  :param list ls: n*3,第1列是时间,第2列是总值,第3列是每个用户具体的数据
467
467
  """
468
468
  from pyecharts.charts import Line
469
- from pyxllib.data.echarts import get_render_body
470
469
 
471
470
  map_user_name = {}
472
471
  for ks, v in self.execute('SELECT account_names, name FROM users'):
@@ -516,7 +515,7 @@ class XlprDb(Connection):
516
515
  to_list([x[2].get(user, 0) for x in ls]),
517
516
  areaStyle={}, stack='Total', emphasis={'focus': 'series'})
518
517
 
519
- return get_render_body(chart), sum(all_users_usaged.values())
518
+ return '<body>' + chart.render_embed() + '</body>', sum(all_users_usaged.values())
520
519
 
521
520
  def dbview_cpu(self, recent=datetime.timedelta(days=1), date_trunc='hour'):
522
521
  from pyxllib.data.echarts import render_echart_html
@@ -5,6 +5,7 @@
5
5
  # @Date : 2022/04/12 08:59
6
6
 
7
7
  import json
8
+ import re
8
9
  import sqlite3
9
10
 
10
11
  import pandas as pd
@@ -106,13 +107,24 @@ class SqlBase:
106
107
  def __3_execute(self):
107
108
  pass
108
109
 
109
- def exec_col(self, *args, **kwargs):
110
- """ 获得第1列的值,注意这个方法跟select_col很像,但更泛用,优先推荐使用exec_col
110
+ def exec2one(self, *args, **kwargs):
111
+ """ 获得第1行的值 """
112
+ return self.execute(*args, **kwargs).fetchone()[0]
111
113
 
112
- >> self.exec_col('SELECT id FROM skindata')
113
- """
114
- for row in self.execute(*args, **kwargs):
115
- yield row[0]
114
+ def exec2row(self, *args, **kwargs):
115
+ """ 获得第1行的值 """
116
+ return self.execute(*args, **kwargs).fetchone()
117
+
118
+ def exec2col(self, *args, **kwargs):
119
+ """ 获得第1列的值 """
120
+ return [row[0] for row in self.execute(*args, **kwargs).fetchall()]
121
+
122
+ # 兼容旧接口
123
+ exec_col = exec2col
124
+
125
+ def exec2df(self, *args, **kwargs):
126
+ """ 获得pandas.DataFrame类型的返回值 """
127
+ return pd.read_sql(*args, self, **kwargs)
116
128
 
117
129
  def __4_数据类型(self):
118
130
  pass
@@ -158,8 +170,10 @@ class SqlBase:
158
170
 
159
171
  def select_col(self, table_name, col):
160
172
  """ 获得一列数据,常使用的功能,所以做了一个封装
173
+
174
+ 注意,"exec"前缀的方法一般返回的是迭代器,而"select"前缀获得一般是直接的全部列表、结果
161
175
  """
162
- return [x[0] for x in self.execute(f'SELECT {col} FROM {table_name}').fetchall()]
176
+ return self.exec2col(f'SELECT {col} FROM {table_name}')
163
177
 
164
178
  def group_count(self, table_name, cols, count_column_name='cnt'):
165
179
  """ 【查】分组统计各组值组合出现次数
@@ -177,6 +191,53 @@ class SqlBase:
177
191
  df = pd.DataFrame.from_records(records, columns=cols.split(',') + [count_column_name])
178
192
  return df
179
193
 
194
+ def get_count_by_altering_query(self, data_query: str) -> int:
195
+ """
196
+ 从给定的SQL SELECT查询中获取行数计数。这个方法通过修改原始的SELECT查询,
197
+ 将其转换为一个COUNT查询来实现计数。这种方法特别适用于在获取大量数据之前,
198
+ 需要预估数据量的场景。
199
+
200
+ 问题背景:
201
+ 在进行大规模数据处理前,了解数据的规模可以帮助进行更有效的资源分配和性能优化。
202
+ 传统的做法是分两步执行:首先计算数据总量,然后再执行实际的数据提取。
203
+ 这个函数旨在通过单个查询来简化这一流程,减少数据库的负载和响应时间。
204
+
205
+ 实现机制:
206
+ 函数首先使用正则表达式识别出SQL查询的FROM关键词,这是因为无论SELECT查询的复杂程度如何,
207
+ 计数的核心都是保留FROM及其后面的表和条件语句。然后,它构造一个新的COUNT查询,
208
+ 替换原始查询中的SELECT部分。最后,函数执行这个新的查询并返回结果。
209
+
210
+ :param data_query (str): 原始的SQL SELECT查询字符串。
211
+ :return int: 查询结果的行数。
212
+
213
+ 示例:
214
+ >> sql = SqlBase()
215
+ >> query = "SELECT id, name FROM users WHERE active = True"
216
+ >> count = sql.get_count_by_altering_query(query)
217
+ >> print(count)
218
+ 45
219
+
220
+ 注意:
221
+ - 这个函数假设输入的是合法的SQL SELECT查询。
222
+ - 函数依赖于数据库连接的execute方法能够正确执行转换后的COUNT查询。
223
+ - 在一些复杂的SQL查询中,特别是包含子查询、特殊函数或复杂的JOIN操作时,
224
+ 请确保转换后的计数查询仍然有效。
225
+ """
226
+ # 使用正则表达式定位'FROM'(考虑各种大小写情况),并确保它前后是空格或语句的开始/结束
227
+ match = re.search(r'\bFROM\b', data_query, flags=re.IGNORECASE)
228
+ if match:
229
+ from_index = match.start()
230
+ count_query = 'SELECT COUNT(*) ' + data_query[from_index:] # 构造计数查询
231
+ try:
232
+ result = self.execute(count_query).fetchone() # 执行查询
233
+ return result[0] if result else 0 # 返回计数结果
234
+ except Exception as e:
235
+ print(f"Error executing count query: {e}")
236
+ return 0
237
+ else:
238
+ print("No 'FROM' keyword found in the data query.")
239
+ return 0
240
+
180
241
 
181
242
  class Connection(sqlite3.Connection, SqlBase):
182
243
  """
@@ -219,12 +280,12 @@ class Connection(sqlite3.Connection, SqlBase):
219
280
  def __3_execute(self):
220
281
  pass
221
282
 
222
- def exec_nametuple(self, *args, **kwargs):
283
+ def exec2nametuple(self, *args, **kwargs):
223
284
  cur = self.cursor()
224
285
  cur.row_factory = sqlite3.Row
225
286
  return cur.execute(*args, **kwargs)
226
287
 
227
- def exec_dict(self, *args, **kwargs):
288
+ def exec2dict(self, *args, **kwargs):
228
289
  """ execute基础上,改成返回值为dict类型 """
229
290
 
230
291
  def dict_factory(cursor, row):
@@ -237,6 +298,9 @@ class Connection(sqlite3.Connection, SqlBase):
237
298
  cur.row_factory = dict_factory
238
299
  return cur.execute(*args, **kwargs)
239
300
 
301
+ # 兼容老版本
302
+ exec_dict = exec2dict
303
+
240
304
  def __4_数据类型(self):
241
305
  pass
242
306
 
@@ -1600,7 +1600,7 @@ class XlPath(type(pathlib.Path())):
1600
1600
  ext = '.' + t.extension
1601
1601
  ext0 = file_path.suffix
1602
1602
 
1603
- if ext0 in ('.docx', '.xlsx', '.pptx'):
1603
+ if ext0 in ('.docx', '.xlsx', '.pptx', '.xlsm'):
1604
1604
  ext0 = '.zip'
1605
1605
  elif ext0 in ('.JPG', '.jpeg'):
1606
1606
  ext0 = '.jpg'
@@ -1751,7 +1751,8 @@ class XlPath(type(pathlib.Path())):
1751
1751
 
1752
1752
  # 六 文件配对
1753
1753
  if run_mode >= 6:
1754
- printf('\n六、文件配对(检查每个目录里stem名称是否配对,列出文件组成不单一的目录结构,请重点检查落单未配对的情况)')
1754
+ printf(
1755
+ '\n六、文件配对(检查每个目录里stem名称是否配对,列出文件组成不单一的目录结构,请重点检查落单未配对的情况)')
1755
1756
  prompt = False
1756
1757
  for root, dirs, files in os.walk(self):
1757
1758
  suffix_counts = defaultdict(list)
@@ -1877,6 +1878,7 @@ class XlPath(type(pathlib.Path())):
1877
1878
  这个不仅用于分组,返回的字符串,也会作为字典序排序的依据,如果想用自然序,记得加natural_sort_key进行转换
1878
1879
  :param batch_name: 设置batch的名称,默认 'batch{}'
1879
1880
  :param bias: 希望用不到这个参数,只有中途出bug,需要继续处理的时候,用来自动增加编号
1881
+ 注意默认就是从1开始编号的,比如bias设成8的话,实际是从9开始编号的
1880
1882
  :param tail_limit: 限制数量少于多少的batch,合并到上一个batch中
1881
1883
  """
1882
1884
  from pyxllib.algo.pupil import Groups
@@ -1974,28 +1976,55 @@ class XlPath(type(pathlib.Path())):
1974
1976
  dst_dir.mkdir(parents=True, exist_ok=True)
1975
1977
 
1976
1978
  # 无法选定文件
1977
- def _move_selectable(self, dst_dir):
1979
+ def _move_selectable(self, dst_dir, *, print_mode=False):
1978
1980
  """ 目录功能,将目录下可选中的文件移动到目标目录
1979
1981
 
1980
- 1、要理解这个看似有点奇怪的功能,需要理解,在数据处理中,可能会拿到超长文件名的文件,
1982
+ 1、要理解这个看似有点奇怪的功能,需要了解一个背景,在数据处理中,可能会拿到超长文件名的文件,
1981
1983
  这种在windows平台虽然手动可以操作,但在代码中,会glob不到,强制指定也会说文件不存在
1982
1984
  2、为了解决这类文件问题,一般需要对其进行某种规则的重命名。因为linux里似乎不会限制文件名长度,所以要把这些特殊文件打包到linux里处理。
1983
1985
  3、因为这些文件本来就无法被选中,所以只能反向操作,将目录下的可选中文件移动到目标目录。
1984
1986
  """
1985
- for p in self.glob('*'):
1986
- if p.exists():
1987
- p.move(dst_dir / p.name)
1987
+ for p in tqdm(self.glob('*'), disable=not print_mode):
1988
+ # 231211周一16:03 一般本来就glob不到,现在的p就是存在的,但是可能以防万一加的捕捉,我现在也不敢删
1989
+ if p.is_file():
1990
+ try:
1991
+ p.move(dst_dir / p.name)
1992
+ except FileNotFoundError:
1993
+ continue
1988
1994
 
1989
- def move_unselectable(self, dst_dir):
1995
+ def move_unselectable(self, dst_dir, *, print_mode=False):
1990
1996
  """ 见_move_selectable,因为无法对这些特殊文件进行移动
1991
1997
  所以这里只是对_move_selectable的封装,中间通过文件重命名,来伪造移动了无法选中文件的操作效果
1992
1998
  """
1993
1999
  tempdir = self.create_tempdir_path(dir=self.parent)
1994
2000
  tempdir.mkdir(exist_ok=True)
1995
- self._move_selectable(tempdir)
2001
+ self._move_selectable(tempdir, print_mode=print_mode)
1996
2002
  self.rename2(dst_dir)
1997
2003
  tempdir.move(self)
1998
2004
 
2005
+ def rename_stem_until_not_exists(self):
2006
+ """ 比较高级的一个操作,会按照某种规则不断重命名,直到是当前并不存在的文件名,常用在文件拷贝避免重名冲突等场景
2007
+
2008
+ todo 写个支持自定义规则的输出参数?
2009
+ todo 有个首次要不要判断exists的问题,可能跟不同的业务场景有关,要思考怎么设计更好...
2010
+ """
2011
+
2012
+ def add_stem(m):
2013
+ a = int(m.group(1)) + 1
2014
+ return f'({a})'
2015
+
2016
+ file = self
2017
+ while file.exists():
2018
+ stem = file.stem
2019
+ m = re.search(r'\(\d+\)$', stem)
2020
+ if m: # 已经有目标范式的编号,继续累加
2021
+ stem = re.sub(r'\((\d+)\)$', add_stem, stem)
2022
+ else: # 还没有编号的,直接从'2'开始编号
2023
+ stem += ' (2)'
2024
+ file = self.with_stem(stem.strip()) # 忽略最后空白,这个很容易出问题
2025
+
2026
+ return file
2027
+
1999
2028
 
2000
2029
  def demo_file():
2001
2030
  """ File类的综合测试"""
@@ -2506,3 +2535,81 @@ class TwinDirs:
2506
2535
  def copy_dir_structure(self):
2507
2536
  """ 复制目录结构 """
2508
2537
  self.src_dir.copy_dir_structure(self.dst_dir)
2538
+
2539
+
2540
+ class BatchFileRenamer:
2541
+ """ 对一批数据,按照某种规则判重、重命名去重
2542
+ 一般是对stem重命名后,确保数据随意混合后名称也不会有出现重复
2543
+ """
2544
+
2545
+ def __init__(self, _dir=None):
2546
+ """
2547
+ :param _dir: 输入待处理的第一个目录
2548
+ """
2549
+ # 所有待处理的文件
2550
+ self.files = []
2551
+ if _dir is not None:
2552
+ self.add_dir(_dir)
2553
+
2554
+ def add_dir(self, _dir):
2555
+ """ 添加一个目录下的所有文件
2556
+ 如果有比较零散的文件待处理,可以直接操作self.files
2557
+
2558
+ todo 目录的重命名?如果引入目录的重命名,算法会复杂非常多的,这个暂不考虑。
2559
+ """
2560
+ for f in XlPath(_dir).rglob_files():
2561
+ self.files.append(f)
2562
+
2563
+ def get_key(self, file):
2564
+ """ 计算一个文件的重复标识,不同文件之间的判重依据 """
2565
+ # 默认的key,规则会比较严,stem不重复,大小写不重复
2566
+ return file.stem.lower()
2567
+
2568
+ def get_new_name(self, file, exists_keys=None):
2569
+ """ 输入的f必须是已经确定要进行重命名的文件
2570
+
2571
+ 对于windows来说
2572
+ 是先假定在一个组中,增加编号
2573
+ 如果编号的文件已经存在,则换一个新的命名组
2574
+
2575
+ 对我这里来说,就不搞这么复杂了,就是无脑加编号就行
2576
+ """
2577
+
2578
+ def add_stem(m):
2579
+ a = int(m.group(1)) + 1
2580
+ return f'({a})'
2581
+
2582
+ stem = file.stem
2583
+ while True:
2584
+ m = re.search(r'\(\d+\)$', stem)
2585
+ if m: # 已经有目标范式的编号,继续累加
2586
+ stem = re.sub(r'\((\d+)\)$', add_stem, stem)
2587
+ else: # 还没有编号的,直接从'2'开始编号
2588
+ stem += ' (2)'
2589
+
2590
+ f2 = file.with_stem(stem.strip()) # 忽略最后空白,这个很容易出问题
2591
+ k2 = self.get_key(f2)
2592
+ if k2 not in exists_keys: # 如果新的命名不会跟旧有文件有任何重复,循环就可以终止了
2593
+ exists_keys.add(k2)
2594
+ return f2
2595
+
2596
+ def rename_files(self, print_mode=False, exists_keys=None):
2597
+ """ 对文件进行批量重命名 """
2598
+ # 1 先遍历一遍文件,确认哪些文件是确定要重命名的
2599
+ exists_keys = exists_keys or set()
2600
+ repeat_name_files = [] # 确认要进行重命名的文件
2601
+ for f in self.files:
2602
+ k = self.get_key(f)
2603
+ if k not in exists_keys:
2604
+ exists_keys.add(k)
2605
+ else:
2606
+ repeat_name_files.append(f)
2607
+
2608
+ # 2 对需要重命名的文件进行操作
2609
+ cnt = 0
2610
+ for f in repeat_name_files:
2611
+ cnt += 1
2612
+ f2 = self.get_new_name(f, exists_keys)
2613
+ if print_mode:
2614
+ print(cnt, f.as_posix(), '-->', f2.name)
2615
+ f.rename2(f2)