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.
- {pyxllib-0.3.110/pyxllib.egg-info → pyxllib-0.3.112}/PKG-INFO +1 -1
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/pupil.py +1 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/stat.py +14 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/pglib.py +122 -12
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/sqlite.py +12 -2
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/specialist/filelib.py +77 -19
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/charclasslib.py +11 -4
- pyxllib-0.3.112/pyxllib/text/jinjalib.py +32 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/newbie.py +12 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/xmllib.py +1 -8
- {pyxllib-0.3.110 → pyxllib-0.3.112/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib.egg-info/SOURCES.txt +1 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/gptlib.py +1 -13
- {pyxllib-0.3.110 → pyxllib-0.3.112}/setup.py +1 -1
- {pyxllib-0.3.110 → pyxllib-0.3.112}/LICENSE +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/MANIFEST.in +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/README.md +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/echarts.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/jsonlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/JLineViewer.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/drissionlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/kq5034lib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/robustprocfile.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/unixlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/ext/yuquelib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/libreoffice.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/file/xlsxlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/multiprocs.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/pupil.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib.egg-info/requires.txt +5 -5
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/data/tiktokenlib.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/requirements.txt +0 -0
- {pyxllib-0.3.110 → pyxllib-0.3.112}/setup.cfg +0 -0
@@ -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
|
-
|
67
|
-
|
68
|
-
|
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
|
-
|
167
|
+
offset = 0
|
162
168
|
|
163
169
|
def yield_row():
|
170
|
+
nonlocal offset
|
164
171
|
while True:
|
165
|
-
|
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
|
-
|
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_
|
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
|
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
|
-
|
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
|
-
|
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=
|
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
|
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
|
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
|
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
|
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
|
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
|
-
|
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['其他字符']
|
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
|
"""
|
@@ -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.
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|