pyxllib 0.3.110__tar.gz → 0.3.112__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 (347) hide show
  1. {pyxllib-0.3.110/pyxllib.egg-info → pyxllib-0.3.112}/PKG-INFO +1 -1
  2. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/pupil.py +1 -0
  3. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/stat.py +14 -0
  4. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/pglib.py +122 -12
  5. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/sqlite.py +12 -2
  6. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/specialist/filelib.py +77 -19
  7. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/charclasslib.py +11 -4
  8. pyxllib-0.3.112/pyxllib/text/jinjalib.py +32 -0
  9. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/newbie.py +12 -0
  10. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/xmllib.py +1 -8
  11. {pyxllib-0.3.110 → pyxllib-0.3.112/pyxllib.egg-info}/PKG-INFO +1 -1
  12. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib.egg-info/SOURCES.txt +1 -0
  13. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/gptlib.py +1 -13
  14. {pyxllib-0.3.110 → pyxllib-0.3.112}/setup.py +1 -1
  15. {pyxllib-0.3.110 → pyxllib-0.3.112}/LICENSE +0 -0
  16. {pyxllib-0.3.110 → pyxllib-0.3.112}/MANIFEST.in +0 -0
  17. {pyxllib-0.3.110 → pyxllib-0.3.112}/README.md +0 -0
  18. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/__init__.py +0 -0
  19. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/__init__.py +0 -0
  20. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/disjoint.py +0 -0
  21. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/geo.py +0 -0
  22. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/intervals.py +0 -0
  23. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/matcher.py +0 -0
  24. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/newbie.py +0 -0
  25. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/shapelylib.py +0 -0
  26. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/specialist.py +0 -0
  27. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/treelib.py +0 -0
  28. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/unitlib.py +0 -0
  29. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/__init__.py +0 -0
  30. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/expert.py +0 -0
  31. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/imfile.py +0 -0
  32. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/imhash.py +0 -0
  33. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/pupil.py +0 -0
  34. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/rgbfmt.py +0 -0
  35. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/trackbartools.py +0 -0
  36. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/xlcvlib.py +0 -0
  37. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/xlpillib.py +0 -0
  38. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/__init__.py +0 -0
  39. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/echarts.py +0 -0
  40. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/jsonlib.py +0 -0
  41. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/oss.py +0 -0
  42. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/sqllib.py +0 -0
  43. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/JLineViewer.py +0 -0
  44. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/__init__.py +0 -0
  45. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/autogui/__init__.py +0 -0
  46. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/autogui/autogui.py +0 -0
  47. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/autogui/virtualkey.py +0 -0
  48. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/demolib.py +0 -0
  49. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/drissionlib.py +0 -0
  50. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/kq5034lib.py +0 -0
  51. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/old.py +0 -0
  52. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/qt.py +0 -0
  53. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/robustprocfile.py +0 -0
  54. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/seleniumlib.py +0 -0
  55. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/tk.py +0 -0
  56. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/unixlib.py +0 -0
  57. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/utools.py +0 -0
  58. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/webhook.py +0 -0
  59. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/win32lib.py +0 -0
  60. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/yuquelib.py +0 -0
  61. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/__init__.py +0 -0
  62. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/docxlib.py +0 -0
  63. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/gitlib.py +0 -0
  64. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/libreoffice.py +0 -0
  65. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/movielib.py +0 -0
  66. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/newbie.py +0 -0
  67. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/onenotelib.py +0 -0
  68. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/packlib/__init__.py +0 -0
  69. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/packlib/zipfile.py +0 -0
  70. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/pdflib.py +0 -0
  71. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/pupil.py +0 -0
  72. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/specialist/__init__.py +0 -0
  73. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/specialist/dirlib.py +0 -0
  74. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/specialist/download.py +0 -0
  75. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/xlsxlib.py +0 -0
  76. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/__init__.py +0 -0
  77. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/deprecatedlib.py +0 -0
  78. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/ipyexec.py +0 -0
  79. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/multiprocs.py +0 -0
  80. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/newbie.py +0 -0
  81. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/pupil.py +0 -0
  82. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/sitepackages.py +0 -0
  83. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/__init__.py +0 -0
  84. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/bc.py +0 -0
  85. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/browser.py +0 -0
  86. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/common.py +0 -0
  87. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/datetime.py +0 -0
  88. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/tictoc.py +0 -0
  89. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/xllog.py +0 -0
  90. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/xlosenv.py +0 -0
  91. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/stdlib/__init__.py +0 -0
  92. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
  93. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/stdlib/tablepyxl/style.py +0 -0
  94. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
  95. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/__init__.py +0 -0
  96. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/ahocorasick.py +0 -0
  97. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/jiebalib.py +0 -0
  98. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/jscode.py +0 -0
  99. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/latex/__init__.py +0 -0
  100. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/levenshtein.py +0 -0
  101. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/nestenv.py +0 -0
  102. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/pupil/__init__.py +0 -0
  103. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/pupil/common.py +0 -0
  104. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/pupil/xlalign.py +0 -0
  105. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/pycode.py +0 -0
  106. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/specialist/__init__.py +0 -0
  107. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/specialist/common.py +0 -0
  108. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/specialist/ptag.py +0 -0
  109. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/spellchecker.py +0 -0
  110. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/vbacode.py +0 -0
  111. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/xl.py +0 -0
  112. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/xlcv.py +0 -0
  113. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib.egg-info/dependency_links.txt +0 -0
  114. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib.egg-info/requires.txt +5 -5
  115. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib.egg-info/top_level.txt +0 -0
  116. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/__init__.py +0 -0
  117. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/__init__.py +0 -0
  118. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/clientlib.py +0 -0
  119. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/specialist.py +0 -0
  120. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/torch_app.py +0 -0
  121. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/xlpaddle.py +0 -0
  122. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/xltorch.py +0 -0
  123. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/__init__.py +0 -0
  124. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/coco.py +0 -0
  125. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/datacls.py +0 -0
  126. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/datasets.py +0 -0
  127. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/__init__.py +0 -0
  128. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/deteval.py +0 -0
  129. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/icdar2013.py +0 -0
  130. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/iou.py +0 -0
  131. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
  132. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/imtextline.py +0 -0
  133. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/labelme.py +0 -0
  134. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/removeline.py +0 -0
  135. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/specialist.py +0 -0
  136. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/tiktokenlib.py +0 -0
  137. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/eval/__init__.py +0 -0
  138. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/paddleocr.py +0 -0
  139. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/__init__.py +0 -0
  140. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
  141. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/__init__.py +0 -0
  142. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
  143. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
  144. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
  145. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
  146. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
  147. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
  148. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
  149. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
  150. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
  151. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
  152. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
  153. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
  154. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
  155. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
  156. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
  157. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
  158. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
  159. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
  160. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
  161. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
  162. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
  163. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
  164. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
  165. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/__init__.py +0 -0
  166. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
  167. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
  168. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/center_loss.py +0 -0
  169. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
  170. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
  171. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
  172. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
  173. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
  174. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
  175. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
  176. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
  177. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
  178. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
  179. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
  180. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
  181. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
  182. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
  183. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
  184. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
  185. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
  186. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
  187. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/__init__.py +0 -0
  188. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
  189. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
  190. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
  191. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
  192. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
  193. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
  194. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
  195. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
  196. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
  197. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
  198. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
  199. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
  200. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
  201. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
  202. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
  203. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
  204. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
  205. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
  206. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
  207. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
  208. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
  209. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
  210. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
  211. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
  212. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
  213. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
  214. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
  215. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
  216. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
  217. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
  218. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
  219. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
  220. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
  221. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
  222. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
  223. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
  224. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
  225. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
  226. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
  227. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
  228. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
  229. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
  230. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
  231. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
  232. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
  233. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
  234. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
  235. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
  236. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
  237. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
  238. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
  239. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
  240. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
  241. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
  242. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
  243. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
  244. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
  245. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
  246. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
  247. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
  248. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
  249. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
  250. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
  251. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
  252. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
  253. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
  254. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
  255. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
  256. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
  257. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
  258. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/__init__.py +0 -0
  259. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/eval.py +0 -0
  260. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/export_center.py +0 -0
  261. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/export_model.py +0 -0
  262. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
  263. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
  264. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
  265. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
  266. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
  267. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
  268. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
  269. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_det.py +0 -0
  270. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
  271. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
  272. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
  273. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_table.py +0 -0
  274. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/program.py +0 -0
  275. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
  276. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/train.py +0 -0
  277. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/xlprog.py +0 -0
  278. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
  279. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/__init__.py +0 -0
  280. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
  281. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
  282. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
  283. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
  284. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
  285. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
  286. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
  287. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
  288. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
  289. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
  290. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
  291. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
  292. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
  293. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
  294. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
  295. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
  296. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
  297. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
  298. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
  299. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
  300. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
  301. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
  302. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
  303. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
  304. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
  305. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
  306. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
  307. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
  308. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
  309. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
  310. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
  311. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
  312. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict90.txt +0 -0
  313. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
  314. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
  315. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
  316. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
  317. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
  318. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
  319. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
  320. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
  321. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/gen_label.py +0 -0
  322. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
  323. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/iou.py +0 -0
  324. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/logging.py +0 -0
  325. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/network.py +0 -0
  326. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
  327. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/profiler.py +0 -0
  328. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/save_load.py +0 -0
  329. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/stats.py +0 -0
  330. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/utility.py +0 -0
  331. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/__init__.py +0 -0
  332. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/predict_system.py +0 -0
  333. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/__init__.py +0 -0
  334. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/eval_table.py +0 -0
  335. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/matcher.py +0 -0
  336. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
  337. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/predict_table.py +0 -0
  338. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
  339. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
  340. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
  341. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
  342. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
  343. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
  344. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/utility.py +0 -0
  345. {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/xlai.py +0 -0
  346. {pyxllib-0.3.110 → pyxllib-0.3.112}/requirements.txt +0 -0
  347. {pyxllib-0.3.110 → pyxllib-0.3.112}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxllib
3
- Version: 0.3.110
3
+ Version: 0.3.112
4
4
  Summary: 厦门理工模式识别团队通用python代码工具库
5
5
  Home-page: https://github.com/XLPRUtils/pyxllib
6
6
  Author: code4101
@@ -163,6 +163,7 @@ class ValuesStat2:
163
163
  from statistics import pstdev, mean
164
164
 
165
165
  # 支持输入可能带有非数值类型的raw_values
166
+ data_type = data_type or ''
166
167
  if raw_values:
167
168
  if 'timestamp' in data_type:
168
169
  values = [x.timestamp() for x in raw_values if hasattr(x, 'timestamp')]
@@ -254,6 +254,7 @@ def xlpivot(df, index=None, columns=None, values=None):
254
254
  :param columns: 列划分方式
255
255
  :param values: 显示的值
256
256
  Callable[items, value]:输出一个函数
257
+ list[str]: 支持输入属性列表,表示显示原始值的意思。如果原始值不唯一,则逗号分开拼接后显示。但这种用法就不太算是传统意义的数据透视表了
257
258
  :return: 数据透视表的表格
258
259
 
259
260
  使用示例:
@@ -261,6 +262,8 @@ def xlpivot(df, index=None, columns=None, values=None):
261
262
  x = items.iloc[0]
262
263
  return f'{x["precision"]:.0f},{x["recall"]:.0f},{x["hmean"]:.2f},{x["fps"]}' # 返回显示的值
263
264
  >> df2 = xlpivot(df, ['model_type'], ['dataset', 'total_frame'], {'precision,recall,hmean,fps': func})
265
+
266
+ 注意技巧:如果要在分组后约束特定顺序,可以使用特殊前缀进行编号对齐
264
267
  """
265
268
 
266
269
  # 1 将分组的格式标准化
@@ -275,6 +278,17 @@ def xlpivot(df, index=None, columns=None, values=None):
275
278
  index_, columns_ = reset_groups(index), reset_groups(columns)
276
279
 
277
280
  # 2 目标值的格式标准化
281
+ def make_col_func(col):
282
+ def func(rows):
283
+ if len(rows):
284
+ return ', '.join(map(str, rows[col].values))
285
+ return ''
286
+
287
+ return func
288
+
289
+ if isinstance(values, (list, tuple)):
290
+ values = {v: make_col_func(v) for v in values}
291
+
278
292
  if callable(values):
279
293
  values_ = {'values': values}
280
294
  elif isinstance(values, dict):
@@ -41,11 +41,11 @@ from tqdm import tqdm
41
41
  import psycopg
42
42
  import psycopg.rows
43
43
 
44
- from pyxllib.prog.newbie import round_int
44
+ from pyxllib.prog.newbie import round_int, human_readable_number
45
45
  from pyxllib.prog.pupil import utc_now, utc_timestamp
46
46
  from pyxllib.prog.specialist import XlOsEnv
47
47
  from pyxllib.algo.pupil import ValuesStat2
48
- from pyxllib.file.specialist import get_etag
48
+ from pyxllib.file.specialist import get_etag, StreamJsonlWriter
49
49
  from pyxllib.data.sqlite import SqlBase, SqlBuilder
50
50
 
51
51
 
@@ -62,12 +62,10 @@ class Connection(psycopg.Connection, SqlBase):
62
62
  """
63
63
  检索当前数据库的活动信息。
64
64
  """
65
- sql = """
66
- SELECT pid, datname, usename, state, query, age(now(), query_start) AS "query_age"
67
- FROM pg_stat_activity
68
- WHERE state = 'active'
69
- """
70
- return self.exec2dict(sql).fetchall()
65
+ sql = SqlBuilder('pg_stat_activity')
66
+ sql.select('pid', 'datname', 'usename', 'state', 'query', 'age(now(), query_start) AS "query_age"')
67
+ sql.where("state = 'active'")
68
+ return self.exec2dict(sql.build_select()).fetchall()
71
69
 
72
70
  def __2_表格(self):
73
71
  pass
@@ -147,9 +145,14 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
147
145
  # cur.close()
148
146
  return data
149
147
 
150
- def exec2dict_batch(self, sql, batch_size=1000, **kwargs):
148
+ def exec2dict_batch(self, sql, batch_size=1000, use_offset=None, **kwargs):
151
149
  """ 分批返回数据的版本
152
150
 
151
+ :param use_offset: 是否使用offset分页,会根据sql中是否含有where自动判断,但有时候最好明确指定以防错误
152
+ 如果外部sql每次操作,会改变数据库的情况,导致sql的where规则虽然没变,但是数据本身发生变化,则offset应该要关闭
153
+ 每次取对应的满足条件的数据即可
154
+ 这种情况,也需要本函数内部主动执行commit_all的
155
+ 否则,只是一种遍历查询,没有where或者where获取的数据情况是不会变化的,则要使用offset
153
156
  :return:
154
157
  第1个值,是一个迭代器,看起来仍然能一条一条返回,实际后台是按照batch_size打包获取的
155
158
  第2个值,是数据总数
@@ -157,12 +160,22 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
157
160
  if not isinstance(sql, SqlBuilder):
158
161
  raise ValueError('暂时只能搭配SQLBuilder使用')
159
162
 
163
+ if use_offset is None:
164
+ use_offset = not sql._where
165
+
160
166
  num = self.exec2one(sql.build_count())
161
- cur = self.exec2dict(sql.build_select(), **kwargs)
167
+ offset = 0
162
168
 
163
169
  def yield_row():
170
+ nonlocal offset
164
171
  while True:
165
- rows = cur.fetchmany(batch_size)
172
+ sql2 = sql.copy()
173
+ if not use_offset: # 如果不使用offset,那么缓存的sql操作需要全部提交,确保数据都更新后,再提取数据
174
+ self.commit_all()
175
+ sql2.limit(batch_size, offset)
176
+ rows = self.exec2dict(sql2.build_select(), **kwargs).fetchall()
177
+ if use_offset:
178
+ offset += len(rows)
166
179
  if not rows:
167
180
  break
168
181
  yield from rows
@@ -191,8 +204,10 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
191
204
  return 'boolean'
192
205
  elif isinstance(val, float):
193
206
  return 'float4'
194
- elif isinstance(val, dict):
207
+ elif isinstance(val, (dict, list)):
195
208
  return 'jsonb'
209
+ elif isinstance(val, datetime.datetime):
210
+ return 'timestamp'
196
211
  else: # 其他list等类型,可以用json.dumps或str转文本存储
197
212
  return 'text'
198
213
 
@@ -334,6 +349,101 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
334
349
 
335
350
  return vs
336
351
 
352
+ def export_jsonl(self, file_path, table_name, key_col=None, batch_size=1000, print_mode=0):
353
+ """ 将某个表导出为本地jsonl文件
354
+
355
+ :param str|SqlBuilder table_name: 表名
356
+ 支持传入SqlBuilder对象,这样可以更灵活的控制导出的数据规则
357
+ :param file_path: 导出的文件路径
358
+ :param batch_size: 每次读取的行数和保存的行数
359
+ :param key_col: 作为主键的列名,如果有的话,会自动去重
360
+ 强烈推荐要设置
361
+ 实际不一定要用主键,只要是有顺序值的列就行
362
+
363
+ todo 暴力最简单的版本不难写,我纠结的是缓存机制,还有bytes类型数据会有点大等问题
364
+ 还需要先支持一个通用的缓存写文件功能
365
+ """
366
+ # 1 sql
367
+ if isinstance(table_name, str):
368
+ sql = SqlBuilder(table_name)
369
+ sql.select('*')
370
+ else:
371
+ sql = table_name
372
+ m = re.search(r'FROM (\w+)', sql.build_select())
373
+ table_name = m.group(1) if m else 'table'
374
+ assert isinstance(sql, SqlBuilder)
375
+
376
+ file_path = XlPath(file_path)
377
+ if key_col:
378
+ sql.order_by(key_col)
379
+ if file_path.is_file():
380
+ # 读取现有数据,找出主键最大值
381
+ data = file_path.read_jsonl(batch_size=1000)
382
+ max_val = max([x[key_col] for x in data]) if data else None
383
+ if max_val is not None:
384
+ sql.where(f'{key_col} > {max_val}')
385
+
386
+ # 2 获取数据
387
+ file = StreamJsonlWriter(file_path, batch_size=batch_size) # 流式存储
388
+ rows, total = self.exec2dict_batch(sql, batch_size=batch_size)
389
+ for row in tqdm(rows, total=total, desc=f'从{table_name}表导出数据', disable=not print_mode):
390
+ file.append_line(row)
391
+ file.flush()
392
+
393
+ def check_db_tables_size(self, db_name=None):
394
+ """ 查看指定数据下所有表格的大小 """
395
+ from datetime import datetime
396
+ import pandas as pd
397
+
398
+ if db_name is None:
399
+ # 使用sql获取当前self所在数据库
400
+ db_name = self.exec2one("SELECT current_database()")
401
+
402
+ data = []
403
+ tables = self.exec2col("SELECT table_name FROM information_schema.tables WHERE table_schema='public'")
404
+ for table_name in tables:
405
+ row = {
406
+ 'database': db_name,
407
+ 'table_name': table_name,
408
+ }
409
+ sz = self.exec2one(f"SELECT pg_total_relation_size('public.{table_name}')")
410
+ if not sz:
411
+ continue
412
+ lines = self.exec2one(f"SELECT COUNT(*) FROM {table_name}")
413
+ row['size'], row['lines'] = sz, lines
414
+ row['readable_size'] = human_readable_number(sz, 'KB')
415
+ row['perline_size'] = human_readable_number(sz / lines, 'KB') if lines else -1
416
+ row['update_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
417
+ data.append(row)
418
+
419
+ df = pd.DataFrame.from_dict(data)
420
+ if len(df):
421
+ df.sort_values(['size'], ascending=False, inplace=True)
422
+ df.reset_index(drop=True, inplace=True)
423
+ return df
424
+
425
+ def check_multi_db_size(self, db_list):
426
+ """ 这个功能一般要用postgres账号,才有权限处理所有数据库 """
427
+ from datetime import datetime
428
+ import pandas as pd
429
+
430
+ data = []
431
+ for db in db_list:
432
+ row = {
433
+ 'name': db,
434
+ }
435
+ sz = self.exec2one(f"SELECT pg_database_size('{db}')")
436
+ row['size'] = sz
437
+ row['readable_size'] = human_readable_number(sz, 'KB')
438
+ row['update_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
439
+
440
+ data.append(row)
441
+
442
+ df = pd.DataFrame.from_dict(data)
443
+ df.sort_values(['size'], ascending=False, inplace=True)
444
+ df.reset_index(drop=True, inplace=True)
445
+ return df
446
+
337
447
 
338
448
  """
339
449
  【关于为什么XlprDb要和pglib合一个文件】
@@ -50,7 +50,13 @@ class SqlBuilder:
50
50
  return self
51
51
 
52
52
  def where(self, condition):
53
- self._where.append(condition)
53
+ if isinstance(condition, (list, tuple)):
54
+ self._where.extend(condition)
55
+ elif isinstance(condition, str):
56
+ self._where.append(condition)
57
+ else:
58
+ raise ValueError(f'不支持的where条件类型{type(condition)}')
59
+
54
60
  return self
55
61
 
56
62
  def where_in(self, column, values):
@@ -85,7 +91,7 @@ class SqlBuilder:
85
91
  self._offset = offset
86
92
  return self
87
93
 
88
- def __2_build_命令(self):
94
+ def __2_build_初级命令(self):
89
95
  pass
90
96
 
91
97
  def build_select(self, *columns):
@@ -124,7 +130,11 @@ class SqlBuilder:
124
130
  sql.append(f"WHERE {' AND '.join(self._where)}")
125
131
  return '\n'.join(sql)
126
132
 
133
+ def __3_build_中级命令(self):
134
+ pass
135
+
127
136
  def build_check_data_type(self, column):
137
+ """ 检查column的数据类型 """
128
138
  sql = SqlBuilder('information_schema.columns')
129
139
  sql.select(f"data_type")
130
140
  sql.where(f"table_name='{self.table}' AND column_name='{column}'")
@@ -1184,30 +1184,46 @@ class XlPath(type(pathlib.Path())):
1184
1184
  json.dump(data, f, **kwargs)
1185
1185
 
1186
1186
  def read_jsonl(self, encoding='utf8', max_items=None, *,
1187
- errors='strict', return_mode: bool = False):
1187
+ errors='strict', return_mode=0, batch_size=None):
1188
1188
  """ 从文件中读取JSONL格式的数据
1189
1189
 
1190
1190
  :param str encoding: 文件编码格式,默认为utf8
1191
1191
  :param str errors: 读取文件时的错误处理方式,默认为strict
1192
1192
  :param bool return_mode: 是否返回文件编码格式,默认为False
1193
+ 0, 读取全量数据返回
1194
+ 1,返回文件编码格式
1193
1195
  :param int max_items: 限制读取的条目数,默认为None,表示读取所有条目
1196
+ :param int batch_size:
1197
+ 默认为None,表示一次性读取所有数据
1198
+ 如果设置了数值,则会流式读取,常用语太大,超过内存大小等的jsonl文件读取
1199
+ 注意如果设置了大小,只是底层每次一批读取的大小,但返回的data仍然是一维的数据格式迭代器
1194
1200
  :return: 返回读取到的数据列表,如果return_mode为True,则同时返回文件编码格式
1195
1201
 
1196
1202
  >> read_jsonl('data.jsonl', max_items=10) # 读取前10条数据
1197
1203
  """
1198
- s, encoding = self.read_text(encoding=encoding, errors=errors, return_mode=True)
1204
+ if batch_size is None:
1205
+ s, encoding = self.read_text(encoding=encoding, errors=errors, return_mode=True)
1206
+
1207
+ data = []
1208
+ # todo 这一步可能不够严谨,不同的操作系统文件格式不同。但使用splitlines也不太好,在数据含有NEL等特殊字符时会多换行。
1209
+ for line in s.split('\n'):
1210
+ if line:
1211
+ try: # 注意,这里可能会有数据读取失败
1212
+ data.append(json.loads(line))
1213
+ except json.decoder.JSONDecodeError:
1214
+ pass
1215
+ # 如果达到了限制的条目数,就停止读取
1216
+ if max_items is not None and len(data) >= max_items:
1217
+ break
1218
+ else:
1219
+ def get_data():
1220
+ for line in self.yield_line(batch_size, encoding=encoding):
1221
+ try: # 注意,这里可能会有数据读取失败
1222
+ yield json.loads(line)
1223
+ except json.decoder.JSONDecodeError:
1224
+ pass
1199
1225
 
1200
- data = []
1201
- # todo 这一步可能不够严谨,不同的操作系统文件格式不同。但使用splitlines也不太好,在数据含有NEL等特殊字符时会多换行。
1202
- for line in s.split('\n'):
1203
- if line:
1204
- try: # 注意,这里可能会有数据读取失败
1205
- data.append(json.loads(line))
1206
- except json.decoder.JSONDecodeError:
1207
- pass
1208
- # 如果达到了限制的条目数,就停止读取
1209
- if max_items is not None and len(data) >= max_items:
1210
- break
1226
+ data = get_data()
1211
1227
 
1212
1228
  if return_mode:
1213
1229
  return data, encoding
@@ -1777,7 +1793,7 @@ class XlPath(type(pathlib.Path())):
1777
1793
 
1778
1794
  return file_summary
1779
1795
 
1780
- def _check_dir_summary(self, print_mode=True, hash_func=None, run_mode=99):
1796
+ def _check_dir_summary(self, print_mode=True, hash_func=None, run_mode=31):
1781
1797
  """ 对文件夹情况进行通用的状态检查
1782
1798
 
1783
1799
  :param hash_func: 可以传入自定义的hash函数,用于第四块的重复文件运算
@@ -1794,28 +1810,28 @@ class XlPath(type(pathlib.Path())):
1794
1810
 
1795
1811
  # 一 目录大小,二 各后缀文件大小
1796
1812
  msg = []
1797
- if run_mode >= 1: # 1和2目前是绑定一起运行的
1813
+ if run_mode & 1: # 1和2目前是绑定一起运行的
1798
1814
  printf('【' + self.as_posix() + '】目录检查')
1799
1815
  printf('\n'.join(self.check_size('list')))
1800
1816
 
1801
1817
  # 三 重名文件
1802
- if run_mode >= 3:
1818
+ if run_mode & 2:
1803
1819
  printf('\n三、重名文件(忽略大小写,跨目录检查name重复情况)')
1804
1820
  printf('\n'.join(self.check_repeat_name_files(print_mode=False)))
1805
1821
 
1806
1822
  # 四 重复文件
1807
- if run_mode >= 4:
1823
+ if run_mode & 4:
1808
1824
  printf('\n四、重复文件(etag相同)')
1809
1825
  printf('\n'.join(self.check_repeat_files(print_mode=False, hash_func=hash_func)))
1810
1826
 
1811
1827
  # 五 错误扩展名
1812
- if run_mode >= 5:
1828
+ if run_mode & 8:
1813
1829
  printf('\n五、错误扩展名')
1814
1830
  for i, (f1, suffix2) in enumerate(self.xglob_faker_suffix_files('**/*'), start=1):
1815
1831
  printf(f'{i}、{f1.relpath(self)} -> {suffix2}')
1816
1832
 
1817
1833
  # 六 文件配对
1818
- if run_mode >= 6:
1834
+ if run_mode & 16:
1819
1835
  printf(
1820
1836
  '\n六、文件配对(检查每个目录里stem名称是否配对,列出文件组成不单一的目录结构,请重点检查落单未配对的情况)')
1821
1837
  prompt = False
@@ -2091,6 +2107,48 @@ class XlPath(type(pathlib.Path())):
2091
2107
  return file
2092
2108
 
2093
2109
 
2110
+ class StreamJsonlWriter:
2111
+ """ 流式存储,主要用于存储文本化、jsonl格式数据 """
2112
+
2113
+ def __init__(self, file_path, batch_size=2000, *,
2114
+ delete_origin_file=False, json_default=str):
2115
+ self.file_path = XlPath(file_path)
2116
+ self.cache_text_lines = []
2117
+ self.batch_size = batch_size
2118
+ self.total_lines = 0
2119
+
2120
+ self.delete_origin_file = delete_origin_file
2121
+ self.json_default = json_default
2122
+
2123
+ def append_line(self, line):
2124
+ self.append_lines([line])
2125
+
2126
+ def append_lines(self, data):
2127
+ """
2128
+ :param list data: 添加一组数据
2129
+ """
2130
+ for x in data:
2131
+ if isinstance(x, str):
2132
+ self.cache_text_lines.append(x)
2133
+ else:
2134
+ self.cache_text_lines.append(json.dumps(x, ensure_ascii=False,
2135
+ default=self.json_default))
2136
+ if len(self.cache_text_lines) >= self.batch_size:
2137
+ self.flush()
2138
+
2139
+ def flush(self):
2140
+ """ 刷新,将当前缓存写入文件 """
2141
+ if self.cache_text_lines:
2142
+ if self.total_lines == 0 and self.delete_origin_file: # 第一次写入时,删除旧缓存文件
2143
+ self.file_path.delete()
2144
+
2145
+ self.total_lines += len(self.cache_text_lines)
2146
+ self.file_path.parent.mkdir(exist_ok=True, parents=True)
2147
+ with open(self.file_path, 'a', encoding='utf8') as f:
2148
+ f.write('\n'.join(self.cache_text_lines) + '\n')
2149
+ self.cache_text_lines = []
2150
+
2151
+
2094
2152
  def demo_file():
2095
2153
  """ File类的综合测试"""
2096
2154
  temp = tempfile.gettempdir()
@@ -2,6 +2,7 @@
2
2
  # -*- coding: utf-8 -*-
3
3
  # @Author : 陈坤泽
4
4
  # @Email : 877362867@qq.com
5
+ # @Date : 2023/12/29
5
6
 
6
7
  """
7
8
  字符分类
@@ -67,7 +68,7 @@ def get_charclass_num(content):
67
68
  return ct2
68
69
 
69
70
 
70
- def get_charclass_rate(content):
71
+ def get_charclass_rate(content, round_digits=4):
71
72
  """ 检查字符类型分布数量 """
72
73
  ct = get_charclass_num(content)
73
74
 
@@ -80,12 +81,18 @@ def get_charclass_rate(content):
80
81
  ct2 = Counter()
81
82
  for k, v in ct.most_common():
82
83
  ct2[k] = v / total
84
+ if round_digits is not None:
85
+ ct2[k] = round(ct2[k], round_digits)
83
86
  return ct2
84
87
 
85
88
 
86
89
  def check_language_from_counter(ct):
87
- """ 检查语言类型 """
88
- # todo 这里的规则应该还可以再优化,以及不同的业务场景,这些规则应该也要再调整
90
+ """ 检查语言类型
91
+
92
+ todo 这里的规则应该还可以再优化,以及不同的业务场景,这些规则应该也要再调整
93
+ 这个比例最早是给表格设计的,表格很可能表头是中文,中间都是英文、数字数据,此时仍然归为中文
94
+ 但如果是一般性的文档,可能要提高中文的比例,才能视为中文文档
95
+ """
89
96
 
90
97
  if '繁体汉字' in ct:
91
98
  if safe_div(ct['繁体汉字'], ct['常用汉字']) > 0.1:
@@ -95,7 +102,7 @@ def check_language_from_counter(ct):
95
102
  return '中文'
96
103
 
97
104
  if '其他字符' in ct:
98
- if ct['其他字符'] / ct['字母'] > 0.1:
105
+ if safe_div(ct['其他字符'], ct['字母']) > 0.1:
99
106
  return '其他'
100
107
 
101
108
  if '字母' in ct:
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2024/05/26
6
+
7
+ from pyxllib.prog.pupil import check_install_package
8
+
9
+ # 一个xpath解析库
10
+ check_install_package('jinja2')
11
+
12
+ import jinja2
13
+ from jinja2 import Template, Environment
14
+
15
+ from pyxllib.file.specialist import XlPath
16
+
17
+
18
+ def set_template(s, *args, **kwargs):
19
+ """ todo 这个名字会不会太容易冲突了? """
20
+ return Template(s.strip(), *args, **kwargs)
21
+
22
+
23
+ def set_meta_template(s, meta_start='[[', meta_end=']]', **kwargs):
24
+ """ 支持预先用某些格式渲染后,再返回标准渲染模板 """
25
+ t = Template(s.strip(), variable_start_string=meta_start,
26
+ variable_end_string=meta_end).render(**kwargs)
27
+ return Template(t)
28
+
29
+
30
+ def get_jinja_template(name, **kwargs):
31
+ template = Environment(**kwargs).from_string((XlPath(__file__).parent / f'templates/{name}').read_text())
32
+ return template
@@ -286,3 +286,15 @@ def fold_dict(d, m=5):
286
286
  vals = [f"'{k}': {v}" for k, v in d.items()]
287
287
  line = [', '.join(vals[i:i + 5]) for i in range(0, len(vals), m)]
288
288
  return '{' + ',\n'.join(line) + '}'
289
+
290
+
291
+ def remove_prefix(original_string, prefix):
292
+ if original_string.startswith(prefix):
293
+ return original_string[len(prefix):]
294
+ return original_string
295
+
296
+
297
+ def remove_suffix(original_string, suffix):
298
+ if original_string.endswith(suffix):
299
+ return original_string[:-len(suffix)]
300
+ return original_string
@@ -32,6 +32,7 @@ from pyxllib.algo.pupil import SearchBase
32
32
  from pyxllib.text.newbie import xldictstr
33
33
  from pyxllib.text.pupil import shorten, ensure_gbk, BookContents, strwidth, grp_chinese_char
34
34
  from pyxllib.file.specialist import File, Dir, get_etag
35
+ from pyxllib.text.jinjalib import get_jinja_template
35
36
 
36
37
 
37
38
  class XlBs4Tag(bs4.element.Tag):
@@ -670,14 +671,6 @@ class HtmlParser:
670
671
  getattr(self, method)(x)
671
672
 
672
673
 
673
- def get_jinja_template(name, **kwargs):
674
- from jinja2 import Environment
675
- from pyxllib.file.specialist import XlPath
676
-
677
- template = Environment(**kwargs).from_string((XlPath(__file__).parent / f'templates/{name}').read_text())
678
- return template
679
-
680
-
681
674
  def concat_htmlbody(ls):
682
675
  """ 对多份网页内容中的body进行拼接
683
676
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxllib
3
- Version: 0.3.110
3
+ Version: 0.3.112
4
4
  Summary: 厦门理工模式识别团队通用python代码工具库
5
5
  Home-page: https://github.com/XLPRUtils/pyxllib
6
6
  Author: code4101
@@ -96,6 +96,7 @@ pyxllib/text/__init__.py
96
96
  pyxllib/text/ahocorasick.py
97
97
  pyxllib/text/charclasslib.py
98
98
  pyxllib/text/jiebalib.py
99
+ pyxllib/text/jinjalib.py
99
100
  pyxllib/text/jscode.py
100
101
  pyxllib/text/levenshtein.py
101
102
  pyxllib/text/nestenv.py
@@ -25,7 +25,6 @@ import io
25
25
  import logging
26
26
  import warnings
27
27
 
28
- from jinja2 import Template
29
28
  from openpyxl import Workbook
30
29
  import pandas as pd
31
30
  import requests
@@ -41,6 +40,7 @@ from pyxllib.prog.specialist import browser, TicToc
41
40
  from pyxllib.algo.pupil import ValuesStat
42
41
  from pyxllib.file.specialist import XlPath, JsonlDataFile, JsonlDataDir, TwinDirs, ensure_localdir
43
42
  from pyxllib.file.xlsxlib import extract_workbook_summary
43
+ from pyxllib.text.jinjalib import set_template, set_meta_template
44
44
 
45
45
 
46
46
  def __1_生成提问数据():
@@ -181,18 +181,6 @@ def check_conversation_lengths(all_texts, n_values=(4, 4),
181
181
  # 比率越大,代表越接近中文场景,汉字越多,要注意len的控制不要让token某些场合超出长度
182
182
 
183
183
 
184
- def set_template(s, *args, **kwargs):
185
- """ todo 这个名字会不会太容易冲突了? """
186
- return Template(s.strip(), *args, **kwargs)
187
-
188
-
189
- def set_meta_template(s, meta_start='[[', meta_end=']]', **kwargs):
190
- """ 支持预先用某些格式渲染后,再返回标准渲染模板 """
191
- t = Template(s.strip(), variable_start_string=meta_start,
192
- variable_end_string=meta_end).render(**kwargs)
193
- return Template(t)
194
-
195
-
196
184
  class StyleParser:
197
185
  def __init__(self, text):
198
186
  # 使用正则表达式拆分文本,并获取权重和风格
@@ -30,7 +30,7 @@ _dir = Path(__file__).parent
30
30
 
31
31
  setup(
32
32
  name='pyxllib', # pip 安装时用的名字
33
- version='0.3.110', # 当前版本,每次更新上传到pypi都需要修改; 第4位版本号一般是修紧急bug
33
+ version='0.3.112', # 当前版本,每次更新上传到pypi都需要修改; 第4位版本号一般是修紧急bug
34
34
  author='code4101',
35
35
  author_email='877362867@qq.com',
36
36
  url='https://github.com/XLPRUtils/pyxllib',
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes