pyxllib 0.3.109__tar.gz → 0.3.111__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 (346) hide show
  1. {pyxllib-0.3.109/pyxllib.egg-info → pyxllib-0.3.111}/PKG-INFO +1 -1
  2. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/pupil.py +30 -14
  3. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/pglib.py +68 -21
  4. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/sqlite.py +22 -3
  5. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/kq5034lib.py +1 -1
  6. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/specialist/filelib.py +79 -21
  7. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/bc.py +5 -2
  8. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/browser.py +8 -2
  9. {pyxllib-0.3.109 → pyxllib-0.3.111/pyxllib.egg-info}/PKG-INFO +1 -1
  10. {pyxllib-0.3.109 → pyxllib-0.3.111}/setup.py +1 -1
  11. {pyxllib-0.3.109 → pyxllib-0.3.111}/LICENSE +0 -0
  12. {pyxllib-0.3.109 → pyxllib-0.3.111}/MANIFEST.in +0 -0
  13. {pyxllib-0.3.109 → pyxllib-0.3.111}/README.md +0 -0
  14. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/__init__.py +0 -0
  15. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/__init__.py +0 -0
  16. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/disjoint.py +0 -0
  17. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/geo.py +0 -0
  18. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/intervals.py +0 -0
  19. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/matcher.py +0 -0
  20. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/newbie.py +0 -0
  21. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/shapelylib.py +0 -0
  22. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/specialist.py +0 -0
  23. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/stat.py +0 -0
  24. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/treelib.py +0 -0
  25. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/unitlib.py +0 -0
  26. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/__init__.py +0 -0
  27. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/expert.py +0 -0
  28. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/imfile.py +0 -0
  29. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/imhash.py +0 -0
  30. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/pupil.py +0 -0
  31. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/rgbfmt.py +0 -0
  32. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/trackbartools.py +0 -0
  33. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/xlcvlib.py +0 -0
  34. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/xlpillib.py +0 -0
  35. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/__init__.py +0 -0
  36. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/echarts.py +0 -0
  37. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/jsonlib.py +0 -0
  38. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/oss.py +0 -0
  39. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/sqllib.py +0 -0
  40. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/JLineViewer.py +0 -0
  41. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/__init__.py +0 -0
  42. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/autogui/__init__.py +0 -0
  43. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/autogui/autogui.py +0 -0
  44. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/autogui/virtualkey.py +0 -0
  45. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/demolib.py +0 -0
  46. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/drissionlib.py +0 -0
  47. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/old.py +0 -0
  48. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/qt.py +0 -0
  49. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/robustprocfile.py +0 -0
  50. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/seleniumlib.py +0 -0
  51. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/tk.py +0 -0
  52. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/unixlib.py +0 -0
  53. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/utools.py +0 -0
  54. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/webhook.py +0 -0
  55. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/win32lib.py +0 -0
  56. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/yuquelib.py +0 -0
  57. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/__init__.py +0 -0
  58. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/docxlib.py +0 -0
  59. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/gitlib.py +0 -0
  60. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/libreoffice.py +0 -0
  61. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/movielib.py +0 -0
  62. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/newbie.py +0 -0
  63. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/onenotelib.py +0 -0
  64. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/packlib/__init__.py +0 -0
  65. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/packlib/zipfile.py +0 -0
  66. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/pdflib.py +0 -0
  67. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/pupil.py +0 -0
  68. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/specialist/__init__.py +0 -0
  69. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/specialist/dirlib.py +0 -0
  70. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/specialist/download.py +0 -0
  71. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/xlsxlib.py +0 -0
  72. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/__init__.py +0 -0
  73. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/deprecatedlib.py +0 -0
  74. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/ipyexec.py +0 -0
  75. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/multiprocs.py +0 -0
  76. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/newbie.py +0 -0
  77. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/pupil.py +0 -0
  78. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/sitepackages.py +0 -0
  79. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/__init__.py +0 -0
  80. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/common.py +0 -0
  81. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/datetime.py +0 -0
  82. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/tictoc.py +0 -0
  83. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/xllog.py +0 -0
  84. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/xlosenv.py +0 -0
  85. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/stdlib/__init__.py +0 -0
  86. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
  87. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/stdlib/tablepyxl/style.py +0 -0
  88. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
  89. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/__init__.py +0 -0
  90. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/ahocorasick.py +0 -0
  91. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/charclasslib.py +0 -0
  92. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/jiebalib.py +0 -0
  93. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/jscode.py +0 -0
  94. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/latex/__init__.py +0 -0
  95. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/levenshtein.py +0 -0
  96. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/nestenv.py +0 -0
  97. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/newbie.py +0 -0
  98. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/pupil/__init__.py +0 -0
  99. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/pupil/common.py +0 -0
  100. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/pupil/xlalign.py +0 -0
  101. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/pycode.py +0 -0
  102. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/specialist/__init__.py +0 -0
  103. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/specialist/common.py +0 -0
  104. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/specialist/ptag.py +0 -0
  105. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/spellchecker.py +0 -0
  106. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/vbacode.py +0 -0
  107. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/xmllib.py +0 -0
  108. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/xl.py +0 -0
  109. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/xlcv.py +0 -0
  110. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib.egg-info/SOURCES.txt +0 -0
  111. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib.egg-info/dependency_links.txt +0 -0
  112. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib.egg-info/requires.txt +4 -4
  113. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib.egg-info/top_level.txt +0 -0
  114. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/__init__.py +0 -0
  115. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/__init__.py +0 -0
  116. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/clientlib.py +0 -0
  117. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/specialist.py +0 -0
  118. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/torch_app.py +0 -0
  119. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/xlpaddle.py +0 -0
  120. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/xltorch.py +0 -0
  121. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/__init__.py +0 -0
  122. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/coco.py +0 -0
  123. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/datacls.py +0 -0
  124. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/datasets.py +0 -0
  125. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/gptlib.py +0 -0
  126. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/__init__.py +0 -0
  127. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/deteval.py +0 -0
  128. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/icdar2013.py +0 -0
  129. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/iou.py +0 -0
  130. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
  131. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/imtextline.py +0 -0
  132. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/labelme.py +0 -0
  133. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/removeline.py +0 -0
  134. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/specialist.py +0 -0
  135. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/tiktokenlib.py +0 -0
  136. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/eval/__init__.py +0 -0
  137. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/paddleocr.py +0 -0
  138. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/__init__.py +0 -0
  139. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
  140. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/__init__.py +0 -0
  141. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
  142. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
  143. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
  144. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
  145. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
  146. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
  147. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
  148. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
  149. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
  150. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
  151. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
  152. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
  153. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
  154. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
  155. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
  156. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
  157. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
  158. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
  159. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
  160. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
  161. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
  162. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
  163. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
  164. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/__init__.py +0 -0
  165. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
  166. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
  167. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/center_loss.py +0 -0
  168. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
  169. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
  170. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
  171. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
  172. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
  173. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
  174. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
  175. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
  176. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
  177. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
  178. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
  179. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
  180. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
  181. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
  182. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
  183. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
  184. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
  185. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
  186. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/__init__.py +0 -0
  187. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
  188. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
  189. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
  190. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
  191. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
  192. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
  193. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
  194. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
  195. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
  196. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
  197. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
  198. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
  199. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
  200. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
  201. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
  202. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
  203. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
  204. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
  205. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
  206. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
  207. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
  208. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
  209. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
  210. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
  211. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
  212. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
  213. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
  214. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
  215. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
  216. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
  217. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
  218. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
  219. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
  220. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
  221. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
  222. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
  223. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
  224. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
  225. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
  226. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
  227. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
  228. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
  229. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
  230. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
  231. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
  232. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
  233. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
  234. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
  235. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
  236. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
  237. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
  238. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
  239. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
  240. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
  241. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
  242. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
  243. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
  244. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
  245. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
  246. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
  247. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
  248. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
  249. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
  250. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
  251. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
  252. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
  253. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
  254. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
  255. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
  256. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
  257. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/__init__.py +0 -0
  258. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/eval.py +0 -0
  259. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/export_center.py +0 -0
  260. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/export_model.py +0 -0
  261. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
  262. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
  263. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
  264. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
  265. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
  266. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
  267. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
  268. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_det.py +0 -0
  269. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
  270. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
  271. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
  272. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_table.py +0 -0
  273. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/program.py +0 -0
  274. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
  275. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/train.py +0 -0
  276. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/xlprog.py +0 -0
  277. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
  278. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/__init__.py +0 -0
  279. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
  280. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
  281. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
  282. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
  283. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
  284. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
  285. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
  286. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
  287. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
  288. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
  289. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
  290. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
  291. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
  292. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
  293. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
  294. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
  295. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
  296. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
  297. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
  298. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
  299. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
  300. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
  301. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
  302. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
  303. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
  304. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
  305. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
  306. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
  307. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
  308. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
  309. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
  310. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
  311. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict90.txt +0 -0
  312. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
  313. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
  314. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
  315. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
  316. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
  317. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
  318. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
  319. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
  320. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/gen_label.py +0 -0
  321. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
  322. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/iou.py +0 -0
  323. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/logging.py +0 -0
  324. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/network.py +0 -0
  325. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
  326. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/profiler.py +0 -0
  327. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/save_load.py +0 -0
  328. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/stats.py +0 -0
  329. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/utility.py +0 -0
  330. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/__init__.py +0 -0
  331. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/predict_system.py +0 -0
  332. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/__init__.py +0 -0
  333. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/eval_table.py +0 -0
  334. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/matcher.py +0 -0
  335. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
  336. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/predict_table.py +0 -0
  337. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
  338. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
  339. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
  340. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
  341. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
  342. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
  343. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/utility.py +0 -0
  344. {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/xlai.py +0 -0
  345. {pyxllib-0.3.109 → pyxllib-0.3.111}/requirements.txt +0 -0
  346. {pyxllib-0.3.109 → pyxllib-0.3.111}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxllib
3
- Version: 0.3.109
3
+ Version: 0.3.111
4
4
  Summary: 厦门理工模式识别团队通用python代码工具库
5
5
  Home-page: https://github.com/XLPRUtils/pyxllib
6
6
  Author: code4101
@@ -6,8 +6,10 @@
6
6
 
7
7
  from bisect import bisect_right
8
8
  from collections import defaultdict, Counter
9
+ import datetime
9
10
  import math
10
11
  import re
12
+ from statistics import quantiles
11
13
  import sys
12
14
  import textwrap
13
15
 
@@ -161,6 +163,7 @@ class ValuesStat2:
161
163
  from statistics import pstdev, mean
162
164
 
163
165
  # 支持输入可能带有非数值类型的raw_values
166
+ data_type = data_type or ''
164
167
  if raw_values:
165
168
  if 'timestamp' in data_type:
166
169
  values = [x.timestamp() for x in raw_values if hasattr(x, 'timestamp')]
@@ -194,7 +197,8 @@ class ValuesStat2:
194
197
  def __len__(self):
195
198
  return self.n
196
199
 
197
- def summary(self, unit=None, precision=4, percentile_count=5):
200
+ def _summary(self, unit=None, precision=4, percentile_count=5):
201
+ """ 返回字典结构的总结 """
198
202
  """ 文本汇总性的报告
199
203
 
200
204
  :param percentile_count: 包括两个极值端点的切分点数,
@@ -204,8 +208,6 @@ class ValuesStat2:
204
208
  :param unit: 展示数值时使用的单位
205
209
  :param precision: 展示数值时的精度
206
210
  """
207
- import datetime
208
- from statistics import quantiles
209
211
 
210
212
  # 1 各种细分的格式化方法
211
213
  def fmt0(v):
@@ -238,19 +240,20 @@ class ValuesStat2:
238
240
  fmt = fmtb = fmt1
239
241
 
240
242
  # 2 生成统计报告
241
- desc = []
243
+ desc = {}
242
244
  if self.raw_n and self.raw_n > self.n:
243
- desc.append(f"非数值数量:{fmt0(self.raw_n - self.n)}")
245
+ desc["总数"] = f"{fmt0(self.n)}/{fmt0(self.raw_n)}≈{self.n / self.raw_n:.2%}"
246
+ else:
247
+ desc["总数"] = f"{fmt0(self.n)}"
244
248
 
245
- desc.append(f"总数:{fmt0(self.n)}")
246
249
  if self.sum is not None:
247
- desc.append(f"总和:{fmt(self.sum)}")
250
+ desc["总和"] = f"{fmt(self.sum)}"
248
251
  if self.mean is not None and self.std is not None:
249
- desc.append(f'均值±标准差:{fmt(self.mean)}±{fmtb(self.std)}')
252
+ desc["均值±标准差"] = f"{fmt(self.mean)}±{fmtb(self.std)}"
250
253
  elif self.mean is not None:
251
- desc.append(f'均值:{fmt(self.mean)}')
254
+ desc["均值"] = f"{fmt(self.mean)}"
252
255
  elif self.std is not None:
253
- desc.append(f'标准差:{fmtb(self.std)}')
256
+ desc["标准差"] = f"{fmtb(self.std)}"
254
257
 
255
258
  if self.values:
256
259
  dist = [self.values[0]]
@@ -259,11 +262,24 @@ class ValuesStat2:
259
262
  dist += quartiles
260
263
  dist.append(self.values[-1])
261
264
 
262
- desc.append(f"分布:{'/'.join([fmt(v) for v in dist])}")
263
- elif self.dist: # 此时当前函数的percentile设置失效,以dist中存储的情况为准
264
- desc.append(f"分布:{'/'.join([fmt(v) for v in self.dist])}")
265
+ desc["分布"] = '/'.join([fmt(v) for v in dist])
266
+ elif self.dist:
267
+ desc["分布"] = '/'.join([fmt(v) for v in self.dist])
265
268
 
266
- return '\t'.join(desc)
269
+ return desc
270
+
271
+ def summary(self, unit=None, precision=4, percentile_count=5):
272
+ """ 文本汇总性的报告
273
+
274
+ :param percentile_count: 包括两个极值端点的切分点数,
275
+ 设置2,就是不设置分位数,就是只展示最小、最大值
276
+ 如果设置了3,就表示"中位数、二分位数",在展示的时候,会显示50%位置的分位数值
277
+ 如果设置了5,就相当于"四分位数",会显示25%、50%、75%位置的分位数值
278
+ :param unit: 展示数值时使用的单位
279
+ :param precision: 展示数值时的精度
280
+ """
281
+ desc = self._summary(unit, precision, percentile_count)
282
+ return '\t'.join([f"{key}: {value}" for key, value in desc.items()])
267
283
 
268
284
  def calculate_ratios(self, x_values, fmt=False):
269
285
  """ 计算并返回一个字典,其中包含每个 x_values 中的值与其小于等于该值的元素的比例
@@ -45,8 +45,8 @@ from pyxllib.prog.newbie import round_int
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
49
- from pyxllib.data.sqlite import SqlBase, SQLBuilder
48
+ from pyxllib.file.specialist import get_etag, StreamJsonlWriter
49
+ from pyxllib.data.sqlite import SqlBase, SqlBuilder
50
50
 
51
51
 
52
52
  class Connection(psycopg.Connection, SqlBase):
@@ -154,15 +154,19 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
154
154
  第1个值,是一个迭代器,看起来仍然能一条一条返回,实际后台是按照batch_size打包获取的
155
155
  第2个值,是数据总数
156
156
  """
157
- if not isinstance(sql, SQLBuilder):
157
+ if not isinstance(sql, SqlBuilder):
158
158
  raise ValueError('暂时只能搭配SQLBuilder使用')
159
159
 
160
160
  num = self.exec2one(sql.build_count())
161
- cur = self.exec2dict(sql.build_select(), **kwargs)
161
+ offset = 0
162
162
 
163
163
  def yield_row():
164
+ nonlocal offset
164
165
  while True:
165
- rows = cur.fetchmany(batch_size)
166
+ sql2 = sql.copy()
167
+ sql2.limit(batch_size, offset)
168
+ rows = self.exec2dict(sql2.build_select(), **kwargs).fetchall()
169
+ offset += batch_size
166
170
  if not rows:
167
171
  break
168
172
  yield from rows
@@ -191,8 +195,10 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
191
195
  return 'boolean'
192
196
  elif isinstance(val, float):
193
197
  return 'float4'
194
- elif isinstance(val, dict):
198
+ elif isinstance(val, (dict, list)):
195
199
  return 'jsonb'
200
+ elif isinstance(val, datetime.datetime):
201
+ return 'timestamp'
196
202
  else: # 其他list等类型,可以用json.dumps或str转文本存储
197
203
  return 'text'
198
204
 
@@ -256,42 +262,42 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
256
262
  def __6_高级统计(self):
257
263
  pass
258
264
 
259
- def get_field_valuesstat(self, table_name, field_name, percentile_count=5,
260
- filter_condition=None, by_data=False):
265
+ def get_column_valuesstat(self, table_name, column, percentile_count=5,
266
+ filter_condition=None, by_data=False):
261
267
  """ 获得指定表格的某个字段的统计特征ValuesStat2对象
262
268
 
263
269
  :param table_name: 表名
264
- :param field_name: 用于计算统计数据的字段名
270
+ :param column: 用于计算统计数据的字段名
265
271
  :param percentile_count: 分位数的数量,例如 3 表示只计算中位数
266
272
  :param by_data: 是否获得原始数据
267
273
  默认只获得统计特征,不获得原始数据
268
274
  """
269
275
 
270
276
  def init_from_db_data():
271
- sql = SQLBuilder(table_name)
277
+ sql = SqlBuilder(table_name)
272
278
  if filter_condition:
273
279
  sql.where(filter_condition)
274
- values = self.exec2col(sql.build_select(field_name))
280
+ values = self.exec2col(sql.build_select(column))
275
281
  if data_type == 'numeric':
276
282
  values = [x and float(x) for x in values]
277
283
  return ValuesStat2(raw_values=values, data_type=data_type)
278
284
 
279
285
  def init_from_db():
280
286
  # 1 构建基础的 SQL 查询
281
- sql = SQLBuilder(table_name)
287
+ sql = SqlBuilder(table_name)
282
288
  sql.select("COUNT(*) AS total_count")
283
- sql.select(f"COUNT({field_name}) AS non_null_count")
284
- sql.select(f"MIN({field_name}) AS min_value")
285
- sql.select(f"MAX({field_name}) AS max_value")
286
- if 'timestamp' in data_type:
289
+ sql.select(f"COUNT({column}) AS non_null_count")
290
+ sql.select(f"MIN({column}) AS min_value")
291
+ sql.select(f"MAX({column}) AS max_value")
292
+ if data_type and 'timestamp' in data_type:
287
293
  percentile_type = 'PERCENTILE_DISC'
288
294
  # todo 其实时间类也可以"泛化"一种平均值、标准差算法的,这需要获取全量数据,然后自己计算
289
295
  elif data_type == 'text':
290
296
  percentile_type = 'PERCENTILE_DISC'
291
297
  else: # 默认是正常的数值类型
292
- sql.select(f"SUM({field_name}) AS total_sum")
293
- sql.select(f"AVG({field_name}) AS average")
294
- sql.select(f"STDDEV({field_name}) AS standard_deviation")
298
+ sql.select(f"SUM({column}) AS total_sum")
299
+ sql.select(f"AVG({column}) AS average")
300
+ sql.select(f"STDDEV({column}) AS standard_deviation")
295
301
  percentile_type = 'PERCENTILE_CONT'
296
302
 
297
303
  percentiles = []
@@ -300,7 +306,7 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
300
306
  step = 1 / (percentile_count - 1)
301
307
  percentiles = [(i * step) for i in range(1, percentile_count - 1)]
302
308
  for p in percentiles:
303
- sql.select(f"{percentile_type}({p:.2f}) WITHIN GROUP (ORDER BY {field_name}) "
309
+ sql.select(f"{percentile_type}({p:.2f}) WITHIN GROUP (ORDER BY {column}) "
304
310
  f"AS percentile_{int(p * 100)}")
305
311
 
306
312
  if filter_condition:
@@ -326,7 +332,7 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
326
332
 
327
333
  return x
328
334
 
329
- data_type = self.get_column_data_type(table_name, field_name)
335
+ data_type = self.get_column_data_type(table_name, column)
330
336
  if by_data:
331
337
  vs = init_from_db_data()
332
338
  else:
@@ -334,6 +340,47 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
334
340
 
335
341
  return vs
336
342
 
343
+ def export_jsonl(self, file_path, table_name, key_col=None, batch_size=1000):
344
+ """ 将某个表导出为本地jsonl文件
345
+
346
+ :param table_name: 表名
347
+ 支持传入SqlBuilder对象,这样可以更灵活的控制导出的数据规则
348
+ :param file_path: 导出的文件路径
349
+ :param batch_size: 每次读取的行数和保存的行数
350
+ :param key_col: 作为主键的列名,如果有的话,会自动去重
351
+ 强烈推荐要设置
352
+ 实际不一定要用主键,只要是有顺序值的列就行
353
+
354
+ todo 暴力最简单的版本不难写,我纠结的是缓存机制,还有bytes类型数据会有点大等问题
355
+ 还需要先支持一个通用的缓存写文件功能
356
+ """
357
+ # 1 sql
358
+ if isinstance(table_name, str):
359
+ sql = SqlBuilder(table_name)
360
+ sql.select('*')
361
+ else:
362
+ sql = table_name
363
+ m = re.search(r'FROM (\w+)', sql.build_select())
364
+ table_name = m.group(1) if m else 'table'
365
+ assert isinstance(sql, SqlBuilder)
366
+
367
+ file_path = XlPath(file_path)
368
+ if key_col:
369
+ sql.order_by(key_col)
370
+ if file_path.is_file():
371
+ # 读取现有数据,找出主键最大值
372
+ data = file_path.read_jsonl(batch_size=1000)
373
+ max_val = max([x[key_col] for x in data]) if data else None
374
+ if max_val is not None:
375
+ sql.where(f'{key_col} > {max_val}')
376
+
377
+ # 2 获取数据
378
+ file = StreamJsonlWriter(file_path, batch_size=batch_size) # 流式存储
379
+ rows, total = self.exec2dict_batch(sql, batch_size=batch_size)
380
+ for row in tqdm(rows, total=total, desc=table_name):
381
+ file.append_line(row)
382
+ file.flush()
383
+
337
384
 
338
385
  """
339
386
  【关于为什么XlprDb要和pglib合一个文件】
@@ -19,7 +19,7 @@ warnings.filterwarnings('ignore', message="pandas only support SQLAlchemy connec
19
19
  warnings.filterwarnings('ignore', message="pandas only supports SQLAlchemy connectable")
20
20
 
21
21
 
22
- class SQLBuilder:
22
+ class SqlBuilder:
23
23
  def __init__(self, table=''):
24
24
  self.table = table
25
25
  self._select = []
@@ -53,6 +53,25 @@ class SQLBuilder:
53
53
  self._where.append(condition)
54
54
  return self
55
55
 
56
+ def where_in(self, column, values):
57
+ if values is None:
58
+ return self
59
+
60
+ if isinstance(values, str):
61
+ values = [values]
62
+ values_str = ', '.join(f"'{str(value)}'" for value in values)
63
+ if len(values) == 1:
64
+ self._where.append(f"{column} = {values_str[0]}")
65
+ else:
66
+ self._where.append(f"{column} IN ({values_str})")
67
+ return self
68
+
69
+ def where_or(self, *conditions):
70
+ """ 输入的这一批条件,作为OR组合后成为一个整体条件
71
+ """
72
+ self._where.append(f"({' OR '.join(conditions)})")
73
+ return self
74
+
56
75
  def group_by(self, *columns):
57
76
  self._group_by.extend(columns)
58
77
  return self
@@ -106,7 +125,7 @@ class SQLBuilder:
106
125
  return '\n'.join(sql)
107
126
 
108
127
  def build_check_data_type(self, column):
109
- sql = SQLBuilder('information_schema.columns')
128
+ sql = SqlBuilder('information_schema.columns')
110
129
  sql.select(f"data_type")
111
130
  sql.where(f"table_name='{self.table}' AND column_name='{column}'")
112
131
  return sql.build_select()
@@ -381,7 +400,7 @@ class SqlBase:
381
400
 
382
401
  def get_column_data_type(self, table_name, col_name):
383
402
  """ 获取表格中某一列的数据类型 """
384
- return self.exec2one(SQLBuilder(table_name).build_check_data_type(col_name))
403
+ return self.exec2one(SqlBuilder(table_name).build_check_data_type(col_name))
385
404
 
386
405
 
387
406
  class Connection(sqlite3.Connection, SqlBase):
@@ -28,7 +28,7 @@ import fire
28
28
  import pandas as pd
29
29
  from tqdm import tqdm
30
30
  import requests
31
- import requests_cache
31
+ # import requests_cache
32
32
 
33
33
  from pyxllib.text.pupil import chinese2digits, grp_chinese_char
34
34
  from pyxllib.file.xlsxlib import openpyxl
@@ -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
@@ -1437,9 +1453,9 @@ class XlPath(type(pathlib.Path())):
1437
1453
  dst = XlPath(dst)
1438
1454
  if dst.exist_preprcs(if_exists):
1439
1455
  if self.is_file():
1440
- shutil.copy2(self, dst)
1456
+ return shutil.copy2(self, dst)
1441
1457
  else:
1442
- shutil.copytree(self, dst)
1458
+ return shutil.copytree(self, dst)
1443
1459
 
1444
1460
  def move(self, dst, if_exists=None):
1445
1461
  if not self.exists():
@@ -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()
@@ -16,7 +16,10 @@ from pyxllib.file.specialist import File, Dir, filesmatch, get_encoding, XlPath
16
16
  # BCompare.exe, bcompare函数要用
17
17
 
18
18
  class BCompare(Explorer):
19
- def __init__(self, app='BCompare', shell=False):
19
+ def __init__(self, app='bcomp', shell=False):
20
+ """
21
+ 240512周日20:06,本来写的是BCompare,但是友鑫mac电脑上发现似乎有问题,所以改成bcomp,这种在windows上也能用
22
+ """
20
23
  super().__init__(app, shell)
21
24
 
22
25
  @classmethod
@@ -48,7 +51,7 @@ class BCompare(Explorer):
48
51
  default_suffix = None
49
52
  for i, arg in enumerate(args):
50
53
  f = XlPath.safe_init(arg)
51
- if f.is_file(): # 是文件对象,且存在
54
+ if f is not None and f.is_file(): # 是文件对象,且存在
52
55
  new_args.append(f)
53
56
  if not default_suffix:
54
57
  default_suffix = f.suffix
@@ -13,6 +13,7 @@ import subprocess
13
13
  import sys
14
14
  import datetime
15
15
  import platform
16
+ import re
16
17
 
17
18
  import pandas as pd
18
19
  from bs4 import BeautifulSoup
@@ -118,9 +119,12 @@ class Explorer:
118
119
  TODO 获得返回值分析
119
120
  """
120
121
  args = [self.app] + list(args)
122
+
121
123
  if 'shell' not in kwargs:
122
124
  kwargs.update({'shell': self.shell})
123
-
125
+ if re.match(r'open\s', self.app):
126
+ args = args[0] + ' ' + args[1]
127
+ kwargs.update({'shell': True})
124
128
  try:
125
129
  if wait:
126
130
  subprocess.run(args, **kwargs)
@@ -161,6 +165,7 @@ class Browser(Explorer):
161
165
  # 这里默认设置为 'google-chrome',如果你想使用其他的浏览器,例如Firefox,可以修改为 'firefox'
162
166
  app = 'google-chrome'
163
167
  else:
168
+ app = 'open -a "Google Chrome"'
164
169
  # 其他系统的处理
165
170
  pass
166
171
  super().__init__(app, shell)
@@ -232,7 +237,8 @@ class Browser(Explorer):
232
237
  :param file: 默认可以不输入,会按七牛的etag哈希值生成临时文件
233
238
  如果输入,则按照指定的名称生成文件
234
239
  """
235
- if XlPath.safe_init(arg).is_file():
240
+ f = XlPath.safe_init(arg)
241
+ if f is not None and f.is_file():
236
242
  file = arg
237
243
  else:
238
244
  file = str(self.to_brower_file(arg, file, clsmsg=clsmsg, to_html_args=to_html_args))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxllib
3
- Version: 0.3.109
3
+ Version: 0.3.111
4
4
  Summary: 厦门理工模式识别团队通用python代码工具库
5
5
  Home-page: https://github.com/XLPRUtils/pyxllib
6
6
  Author: code4101
@@ -30,7 +30,7 @@ _dir = Path(__file__).parent
30
30
 
31
31
  setup(
32
32
  name='pyxllib', # pip 安装时用的名字
33
- version='0.3.109', # 当前版本,每次更新上传到pypi都需要修改; 第4位版本号一般是修紧急bug
33
+ version='0.3.111', # 当前版本,每次更新上传到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
File without changes