pyxllib 0.3.101__tar.gz → 0.3.102__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.101/pyxllib.egg-info → pyxllib-0.3.102}/PKG-INFO +1 -1
- pyxllib-0.3.102/pyxllib/data/jsonlib.py +89 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/JLineViewer.py +1 -1
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/robustprocfile.py +157 -10
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/utools.py +13 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib.egg-info/SOURCES.txt +1 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/setup.py +1 -1
- {pyxllib-0.3.101 → pyxllib-0.3.102}/LICENSE +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/MANIFEST.in +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/README.md +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/pupil.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/stat.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/data/echarts.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/data/pglib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/data/sqlite.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/kq5034lib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/unixlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/ext/yuquelib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/specialist/filelib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/file/xlsxlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/multiprocs.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/pupil.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/charclasslib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/newbie.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib.egg-info/requires.txt +4 -4
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/gptlib.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/requirements.txt +0 -0
- {pyxllib-0.3.101 → pyxllib-0.3.102}/setup.cfg +0 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Author : 陈坤泽
|
4
|
+
# @Email : 877362867@qq.com
|
5
|
+
# @Date : 2024/04/01
|
6
|
+
|
7
|
+
from collections import Counter
|
8
|
+
|
9
|
+
from pyxllib.prog.pupil import check_install_package
|
10
|
+
|
11
|
+
check_install_package('jmespath')
|
12
|
+
|
13
|
+
import jmespath
|
14
|
+
|
15
|
+
|
16
|
+
class JsonTool:
|
17
|
+
@classmethod
|
18
|
+
def find_paths_by_condition(cls, obj, condition, current_path=''):
|
19
|
+
"""
|
20
|
+
根据提供的条件递归搜索JSON对象,查找满足条件的路径。
|
21
|
+
"""
|
22
|
+
if isinstance(obj, dict):
|
23
|
+
for k, v in obj.items():
|
24
|
+
new_path = f"{current_path}.{k}" if current_path else k
|
25
|
+
if condition(k, v):
|
26
|
+
yield new_path
|
27
|
+
else:
|
28
|
+
if isinstance(v, (dict, list)):
|
29
|
+
yield from JsonTool.find_paths_by_condition(v, condition, new_path)
|
30
|
+
elif isinstance(obj, list):
|
31
|
+
for index, item in enumerate(obj):
|
32
|
+
new_path = f"{current_path}[{index}]"
|
33
|
+
if isinstance(item, (dict, list)):
|
34
|
+
yield from JsonTool.find_paths_by_condition(item, condition, new_path)
|
35
|
+
|
36
|
+
@classmethod
|
37
|
+
def find_paths_with_key(cls, obj, key, current_path=''):
|
38
|
+
"""
|
39
|
+
查找包含指定键名的路径。
|
40
|
+
"""
|
41
|
+
# 定义一个简单的条件函数,仅基于键名
|
42
|
+
condition = lambda k, v: k == key
|
43
|
+
return JsonTool.find_paths_by_condition(obj, condition, current_path)
|
44
|
+
|
45
|
+
|
46
|
+
class JsonlTool:
|
47
|
+
@classmethod
|
48
|
+
def check_key_positions(cls, json_list, key):
|
49
|
+
"""
|
50
|
+
在JSON对象列表中统计每种包含指定键名的路径出现的次数。
|
51
|
+
|
52
|
+
:param json_list: 包含多个JSON对象的列表。
|
53
|
+
:param key: 要查找的键名。
|
54
|
+
:return: 一个Counter对象,统计每种路径出现的次数。
|
55
|
+
"""
|
56
|
+
paths_counter = Counter()
|
57
|
+
for json_obj in json_list:
|
58
|
+
# 使用JsonTool查找当前对象中包含指定键的路径
|
59
|
+
paths = list(JsonTool.find_paths_with_key(json_obj, key))
|
60
|
+
paths_counter.update(paths)
|
61
|
+
|
62
|
+
return paths_counter
|
63
|
+
|
64
|
+
@classmethod
|
65
|
+
def check_path_values(cls, json_list, jmespath_expression, value_extractor=lambda x: x):
|
66
|
+
"""
|
67
|
+
根据提供的jmespath表达式,在JSON对象列表中直接统计表达式取值的次数。
|
68
|
+
支持自定义函数来获取要统计的键。
|
69
|
+
|
70
|
+
:param json_list: 包含多个JSON对象的列表。
|
71
|
+
:param jmespath_expression: 要应用的jmespath表达式。
|
72
|
+
:param value_extractor: 一个函数,用于从jmespath.search的结果中提取要统计的值。
|
73
|
+
:return: 一个Counter对象,统计提取值出现的次数。
|
74
|
+
"""
|
75
|
+
values_counter = Counter()
|
76
|
+
for json_obj in json_list:
|
77
|
+
|
78
|
+
# 使用jmespath搜索当前对象
|
79
|
+
result = jmespath.search(jmespath_expression, json_obj)
|
80
|
+
# 使用自定义的value_extractor函数提取要统计的值
|
81
|
+
extracted_values = value_extractor(result)
|
82
|
+
if not isinstance(extracted_values, list):
|
83
|
+
extracted_values = [extracted_values]
|
84
|
+
|
85
|
+
for value in extracted_values:
|
86
|
+
values_counter[value] += 1
|
87
|
+
|
88
|
+
values_counter = Counter(dict(values_counter.most_common()))
|
89
|
+
return values_counter
|
@@ -476,7 +476,7 @@ def start_jlineviewer(fname=None):
|
|
476
476
|
if isinstance(fname, list): # 可以输入一个list字典数据,会转存到临时目录里查看
|
477
477
|
tempfile = XlPath.tempfile(suffix='.jsonl')
|
478
478
|
tempfile.write_jsonl(fname)
|
479
|
-
fname = tempfile
|
479
|
+
fname = tempfile.as_posix()
|
480
480
|
if fname:
|
481
481
|
ex.showDialog(fname=fname)
|
482
482
|
sys.exit(app.exec_())
|
@@ -10,14 +10,19 @@
|
|
10
10
|
半定制化的功能组件
|
11
11
|
"""
|
12
12
|
|
13
|
+
from pyxllib.prog.pupil import check_install_package
|
14
|
+
|
15
|
+
check_install_package('joblib')
|
16
|
+
|
13
17
|
from collections import defaultdict, Counter
|
14
18
|
import datetime
|
15
19
|
import re
|
16
20
|
import json
|
17
21
|
|
18
22
|
from tqdm import tqdm
|
23
|
+
from joblib import Parallel, delayed
|
19
24
|
|
20
|
-
from pyxllib.prog.pupil import check_counter, tprint
|
25
|
+
from pyxllib.prog.pupil import check_counter, tprint, typename
|
21
26
|
from pyxllib.file.specialist import XlPath, refinepath
|
22
27
|
|
23
28
|
|
@@ -232,8 +237,9 @@ class CacheJsonlFile:
|
|
232
237
|
def save_all(self):
|
233
238
|
""" 最终存储的文件名 """
|
234
239
|
self.flush()
|
235
|
-
|
236
|
-
|
240
|
+
if self.cache_file.is_file():
|
241
|
+
dst_file = self.cache_file.with_stem(f'{self.prefix_stem}_{self.tag}{self.total}_{get_timestamp()}')
|
242
|
+
self.cache_file.rename(dst_file)
|
237
243
|
|
238
244
|
|
239
245
|
class CacheJsonlGroupFiles:
|
@@ -274,7 +280,8 @@ def process_single_file(root,
|
|
274
280
|
total=None,
|
275
281
|
if_exists='skip',
|
276
282
|
group_func=None,
|
277
|
-
batch_size=2000
|
283
|
+
batch_size=2000,
|
284
|
+
debug=False):
|
278
285
|
# 1 缓存路径
|
279
286
|
srcdir = XlPath(root)
|
280
287
|
infile = XlPath.init(infile, root=srcdir)
|
@@ -284,11 +291,22 @@ def process_single_file(root,
|
|
284
291
|
errdir = srcdir.parent / f'{srcdir.name}_{tag}error' / relpath.parent
|
285
292
|
|
286
293
|
# 2 判断是不是已处理过的文件
|
287
|
-
stem = re.split(r'\d+_\d{14}', relpath.stem)[0]
|
288
|
-
|
289
|
-
|
294
|
+
# stem = re.split(r'\d+_\d{14}', relpath.stem)[0]
|
295
|
+
stem = relpath.stem + f'_{tag}'
|
296
|
+
dstfiles = list(dstdir.glob_files(f'{stem}*.jsonl'))
|
297
|
+
errfiles = list(errdir.glob_files(f'{stem}*.jsonl'))
|
298
|
+
|
299
|
+
# 需要进一步过滤
|
300
|
+
def is_exists_old_file(f):
|
301
|
+
if f.name.endswith('.cache.jsonl'):
|
302
|
+
return False
|
303
|
+
stem2 = f.name[len(stem):]
|
304
|
+
if re.match(r'(error)?\d+_\d{14}.jsonl$', stem2):
|
305
|
+
return True
|
306
|
+
|
290
307
|
# cache文件不算,不用管
|
291
|
-
check_files = [f for f in (dstfiles + errfiles) if
|
308
|
+
check_files = [f for f in (dstfiles + errfiles) if is_exists_old_file(f)]
|
309
|
+
|
292
310
|
if check_files:
|
293
311
|
if if_exists == 'skip':
|
294
312
|
return
|
@@ -301,15 +319,23 @@ def process_single_file(root,
|
|
301
319
|
return
|
302
320
|
|
303
321
|
# 3 处理数据
|
322
|
+
if debug: # 如果开启调试模式,则关闭分组功能
|
323
|
+
group_func = None
|
304
324
|
dstcgf = CacheJsonlGroupFiles(dstdir, infile.stem, tag, group_func, batch_size)
|
305
325
|
errcgf = CacheJsonlGroupFiles(errdir, infile.stem, tag + 'error', batch_size=batch_size)
|
326
|
+
if debug: # 如果开启调试模式,则单独分错误文件
|
327
|
+
errcgf = dstcgf
|
306
328
|
|
307
329
|
for line in tqdm(infile.yield_line(), disable=total):
|
330
|
+
# todo 出错的数据,应该添加错误信息,也存成一个新的jsonl格式
|
308
331
|
row = row_func(line)
|
309
|
-
if row:
|
332
|
+
if row and (not isinstance(row, dict) or row.get('status', 'ok') == 'ok'):
|
333
|
+
# 必须要有内容,但如果内容有个status字段且不是'ok',也不能要
|
310
334
|
dstcgf.append([row])
|
311
335
|
else:
|
312
|
-
|
336
|
+
# 注意旧版存储的事line,但是新版的存储成row了
|
337
|
+
# 但如果row确实没内容,还是兼容旧版,存储line
|
338
|
+
errcgf.append([row or line])
|
313
339
|
|
314
340
|
dstcgf.save_all()
|
315
341
|
errcgf.save_all()
|
@@ -317,3 +343,124 @@ def process_single_file(root,
|
|
317
343
|
tprint(f'处理第{cur_idx}/{total}个文件:{infile.name} ==> {tag}')
|
318
344
|
else:
|
319
345
|
tprint(f'处理文件:{infile.name} ==> {tag}')
|
346
|
+
|
347
|
+
|
348
|
+
class StructureAnalyzer:
|
349
|
+
@classmethod
|
350
|
+
def item_to_json(cls, x, depth):
|
351
|
+
""" 获得字典结构的签名
|
352
|
+
|
353
|
+
todo 这个项目之后,可以对这个函数进一步优化精简,作为以后解析结构的一个通用工具
|
354
|
+
"""
|
355
|
+
if depth <= 0:
|
356
|
+
return typename(x)
|
357
|
+
|
358
|
+
if isinstance(x, dict):
|
359
|
+
d = {}
|
360
|
+
keys = sorted(x.keys())
|
361
|
+
for k in keys:
|
362
|
+
d[k] = cls.item_to_json(x[k], depth - 1)
|
363
|
+
elif isinstance(x, list):
|
364
|
+
d = []
|
365
|
+
for k in x:
|
366
|
+
d.append(cls.item_to_json(k, depth - 1))
|
367
|
+
else:
|
368
|
+
d = typename(x)
|
369
|
+
|
370
|
+
return d
|
371
|
+
|
372
|
+
@classmethod
|
373
|
+
def item_to_str(cls, x, depth):
|
374
|
+
res = cls.item_to_json(x, depth)
|
375
|
+
return json.dumps(res)
|
376
|
+
|
377
|
+
@classmethod
|
378
|
+
def group_items(cls, items, depth):
|
379
|
+
ct = Counter()
|
380
|
+
groups = defaultdict(list)
|
381
|
+
for x in items:
|
382
|
+
desc = cls.item_to_str(x, depth)
|
383
|
+
ct[desc] += 1
|
384
|
+
groups[desc].append(x)
|
385
|
+
# 按照值的数量对groups排序
|
386
|
+
groups = dict(sorted(groups.items(), key=lambda x: -len(x[1])))
|
387
|
+
return groups
|
388
|
+
|
389
|
+
@classmethod
|
390
|
+
def get_items_structures(cls, items, savefile=None):
|
391
|
+
""" 获取jsonl数据的结构分布
|
392
|
+
|
393
|
+
:param list[json] items: 一组json数据
|
394
|
+
:return list[json]: 统计每种结构的分布数量,按树形结构,从多到少排序展示
|
395
|
+
"""
|
396
|
+
|
397
|
+
def add_group(parent, items, depth, res):
|
398
|
+
tag = parent['depth'] if parent else ''
|
399
|
+
groups = cls.group_items(items, depth)
|
400
|
+
for i, (desc, items2) in enumerate(groups.items(), start=1):
|
401
|
+
if desc == parent['desc']: # 再细化的结果跟父结点相同时,不再加深层级
|
402
|
+
continue
|
403
|
+
|
404
|
+
d = {}
|
405
|
+
d['depth'] = f'{tag}-{i}' if tag else f'{i}'
|
406
|
+
d['count'] = len(items2)
|
407
|
+
d['desc'] = desc
|
408
|
+
d['structure'] = cls.item_to_json(items2[0], depth)
|
409
|
+
res.append(d)
|
410
|
+
|
411
|
+
add_group(d, items2, depth + 1, res)
|
412
|
+
|
413
|
+
res = [] # 初始化结果列表
|
414
|
+
add_group({'depth': '', 'desc': ''}, items, 1, res) # 从空标签开始递归
|
415
|
+
|
416
|
+
if savefile:
|
417
|
+
XlPath(savefile).write_jsonl(res)
|
418
|
+
|
419
|
+
return res
|
420
|
+
|
421
|
+
|
422
|
+
def process_batch_files(srcdir,
|
423
|
+
dsttag,
|
424
|
+
line_convert_func,
|
425
|
+
pattern='*.jsonl',
|
426
|
+
if_exists='skip',
|
427
|
+
processes_num=1,
|
428
|
+
group_func=None,
|
429
|
+
batch_size=2000,
|
430
|
+
debug=False,
|
431
|
+
):
|
432
|
+
""" 通用批处理函数
|
433
|
+
|
434
|
+
:param srcdir: 输入待处理的目录或文件
|
435
|
+
:param pattern: 文件名检索逻辑,如 '*','*.jsonl', '*_std*.jsonl'等
|
436
|
+
:param if_exists: 如果目标文件已存在,如何处理。'skip'跳过不重复处理,'overwrite'覆盖重新运行,'error'抛出报错
|
437
|
+
:param processes_num: 并发处理的进程数
|
438
|
+
:param batch_size: 每个文件缓存的条目数,超过这个数目后就会先写入文件
|
439
|
+
"""
|
440
|
+
# 1 检索文件
|
441
|
+
srcdir = XlPath(srcdir)
|
442
|
+
if srcdir.is_file():
|
443
|
+
files = [srcdir.name]
|
444
|
+
srcdir = srcdir.parent
|
445
|
+
else:
|
446
|
+
files = [f.relpath(srcdir) for f in srcdir.rglob_files(pattern)]
|
447
|
+
|
448
|
+
file_num = len(files)
|
449
|
+
|
450
|
+
# 2 并发处理多个文件
|
451
|
+
backend = 'loky' if processes_num > 1 else 'sequential'
|
452
|
+
tasks = []
|
453
|
+
for i, f in enumerate(files, start=1):
|
454
|
+
task = delayed(process_single_file)(srcdir,
|
455
|
+
f,
|
456
|
+
dsttag,
|
457
|
+
line_convert_func,
|
458
|
+
cur_idx=i,
|
459
|
+
total=file_num,
|
460
|
+
if_exists=if_exists,
|
461
|
+
group_func=group_func,
|
462
|
+
batch_size=batch_size,
|
463
|
+
debug=debug)
|
464
|
+
tasks.append(task)
|
465
|
+
|
466
|
+
Parallel(n_jobs=processes_num, backend=backend)(tasks)
|
@@ -222,6 +222,19 @@ class UtoolsFile(UtoolsBase):
|
|
222
222
|
from pyxllib.ext.JLineViewer import start_jlineviewer
|
223
223
|
start_jlineviewer(self.paths[0].as_posix())
|
224
224
|
|
225
|
+
def open_jsonl_with_excel(self):
|
226
|
+
""" 用excel打开jsonl文件 """
|
227
|
+
from pyxllib.algo.stat import write_dataframes_to_excel
|
228
|
+
|
229
|
+
file = self.paths[0].as_posix()
|
230
|
+
data = XlPath(file).read_jsonl()
|
231
|
+
|
232
|
+
file = XlPath.create_tempfile_path('.xlsx')
|
233
|
+
df = pd.DataFrame.from_dict(data)
|
234
|
+
write_dataframes_to_excel(file, {'Sheet1': df})
|
235
|
+
|
236
|
+
os.startfile(file)
|
237
|
+
|
225
238
|
|
226
239
|
class UtoolsText(UtoolsBase):
|
227
240
|
|
@@ -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.102', # 当前版本,每次更新上传到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
|
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
|
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
|
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
|
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
|