pyxllib 0.3.88__tar.gz → 0.3.89__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.88/pyxllib.egg-info → pyxllib-0.3.89}/PKG-INFO +1 -1
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/unixlib.py +2 -2
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/packlib/__init__.py +6 -2
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/xlsxlib.py +155 -132
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/pupil.py +11 -1
- {pyxllib-0.3.88 → pyxllib-0.3.89/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.88 → pyxllib-0.3.89}/setup.py +1 -1
- {pyxllib-0.3.88 → pyxllib-0.3.89}/LICENSE +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/MANIFEST.in +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/README.md +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/pupil.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/stat.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/data/echarts.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/data/pglib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/data/sqlite.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/JLineViewer.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/kq5034lib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/ext/yuquelib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/file/specialist/filelib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/charclasslib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/newbie.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib.egg-info/SOURCES.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib.egg-info/requires.txt +3 -3
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/gptlib.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/requirements.txt +0 -0
- {pyxllib-0.3.88 → pyxllib-0.3.89}/setup.cfg +0 -0
@@ -295,7 +295,7 @@ class XlSSHClient(paramiko.SSHClient):
|
|
295
295
|
return (XlPath(k) / relpath).parent
|
296
296
|
except ValueError:
|
297
297
|
pass
|
298
|
-
raise ValueError('找不到对应的map_path路径映射规则')
|
298
|
+
raise ValueError(f'找不到对应的map_path路径映射规则 {remote_path}')
|
299
299
|
|
300
300
|
def __remote_dir(self, local_path, remote_dir):
|
301
301
|
if remote_dir is not None:
|
@@ -415,7 +415,7 @@ class XlSSHClient(paramiko.SSHClient):
|
|
415
415
|
remote_path = self.__remote_dir(local_path, None) / local_path.name
|
416
416
|
local_dir = local_path.parent
|
417
417
|
else:
|
418
|
-
remote_path = self.Path(remote_path)
|
418
|
+
remote_path = self.Path(remote_path.as_posix())
|
419
419
|
local_dir = self.__local_dir(remote_path, local_dir)
|
420
420
|
local_path = local_dir / remote_path.name
|
421
421
|
|
@@ -276,14 +276,18 @@ def smart_compress_zip(root, paths, check_func=None):
|
|
276
276
|
|
277
277
|
root = XlPath(root)
|
278
278
|
num = len(paths)
|
279
|
+
outfile = None
|
279
280
|
if num > 1:
|
280
|
-
|
281
|
+
outfile = root.parent / XlPath(root.name + '.zip')
|
281
282
|
elif num == 1:
|
282
|
-
|
283
|
+
outfile = root.parent / (XlPath(paths[0]).name + '.zip')
|
283
284
|
else:
|
284
285
|
return
|
286
|
+
zipf = XlZipFile(outfile, 'w', zipfile.ZIP_DEFLATED)
|
285
287
|
|
286
288
|
for subroot in paths:
|
287
289
|
add_path(XlPath(subroot))
|
288
290
|
|
289
291
|
zipf.close()
|
292
|
+
|
293
|
+
return outfile
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
# @Author : 陈坤泽
|
4
4
|
# @Email : 877362867@qq.com
|
5
|
-
# @Date :
|
5
|
+
# @Date : 2024/01/07
|
6
6
|
|
7
7
|
"""
|
8
8
|
扩展了些自己的openpyxl工具
|
@@ -48,7 +48,7 @@ from pyxllib.file.specialist import XlPath
|
|
48
48
|
|
49
49
|
|
50
50
|
def __1_basic():
|
51
|
-
"""
|
51
|
+
""" 表格的组件功能 """
|
52
52
|
|
53
53
|
|
54
54
|
def excel_addr(n, m) -> str:
|
@@ -92,8 +92,8 @@ def is_valid_excel_range(range):
|
|
92
92
|
if ':' in range:
|
93
93
|
start, end = range.split(':')
|
94
94
|
return (is_valid_excel_cell(start) or start.isdigit() or re.fullmatch(r'[A-Z]+', start)) and \
|
95
|
-
|
96
|
-
|
95
|
+
(is_valid_excel_cell(end) or end.isdigit() or re.fullmatch(r'[A-Z]+', end)) and \
|
96
|
+
start <= end
|
97
97
|
else:
|
98
98
|
return is_valid_excel_cell(range)
|
99
99
|
|
@@ -279,6 +279,19 @@ def sort_excel_files(file_paths):
|
|
279
279
|
return file_paths2
|
280
280
|
|
281
281
|
|
282
|
+
def excel2md5(file, reduction_degree=1):
|
283
|
+
try:
|
284
|
+
wb = openpyxl.load_workbook(file)
|
285
|
+
except (ValueError, TypeError) as e:
|
286
|
+
# 有些表格直接读取会失败,但使用read_only就能读了
|
287
|
+
wb = openpyxl.load_workbook(file, read_only=True)
|
288
|
+
except Exception as e: # 还有其他zipfile.BadZipFile等错误
|
289
|
+
print(file, str(e))
|
290
|
+
return ''
|
291
|
+
|
292
|
+
return wb.to_md5(reduction_degree)
|
293
|
+
|
294
|
+
|
282
295
|
def convert_csv_to_xlsx(csv_file):
|
283
296
|
""" 将 csv 文件转换为 xlsx 文件 """
|
284
297
|
wb = Workbook()
|
@@ -317,8 +330,8 @@ def convert_xls_to_xlsx(xls_file):
|
|
317
330
|
return wb
|
318
331
|
|
319
332
|
|
320
|
-
def
|
321
|
-
"""
|
333
|
+
def __2_openpyxl_class():
|
334
|
+
""" 对openpyxl已有类的功能的增强 """
|
322
335
|
|
323
336
|
|
324
337
|
class XlCell(openpyxl.cell.cell.Cell): # 适用于 openpyxl.cell.cell.MergedCell,但这里不能多重继承
|
@@ -1632,80 +1645,11 @@ class XlWorkbook(openpyxl.Workbook):
|
|
1632
1645
|
|
1633
1646
|
return workbook_summary
|
1634
1647
|
|
1635
|
-
def extract_summary3(self):
|
1636
|
-
""" 另一套按照单元格提取摘要的程序 """
|
1637
|
-
wb = self
|
1638
|
-
|
1639
|
-
all_sheets_summary = []
|
1640
|
-
|
1641
|
-
for ws in wb._sheets: # 非数据表,也要遍历出来,所以使用了_sheets
|
1642
|
-
# 如果是标准工作表(Worksheet),使用现有的摘要提取机制
|
1643
|
-
if isinstance(ws, openpyxl.worksheet.worksheet.Worksheet):
|
1644
|
-
# 找到使用范围和表头范围
|
1645
|
-
raw_used_range = ws.get_raw_usedrange()
|
1646
|
-
if raw_used_range:
|
1647
|
-
used_range = ws.get_usedrange()
|
1648
|
-
summary = ({
|
1649
|
-
"sheetName": ws.title,
|
1650
|
-
"sheetType": "Worksheet",
|
1651
|
-
"rawUsedRange": raw_used_range,
|
1652
|
-
"usedRange": used_range,
|
1653
|
-
|
1654
|
-
})
|
1655
|
-
summary['tables'] = ws.find_tables(used_range)
|
1656
|
-
|
1657
|
-
# 'cells': extract_cells_content(ws) # todo 改进点
|
1658
|
-
|
1659
|
-
# todo 231213周三21:36,好久没看,我都不确定这种类型问题了,后面要再核对一遍
|
1660
|
-
if not summary['cells']: # 如果没有数据,则大概率是数据透视表,是计算出来的,读取不到~
|
1661
|
-
summary['sheetType'] = 'PivotTable'
|
1662
|
-
del summary['cells']
|
1663
|
-
else:
|
1664
|
-
summary = ({
|
1665
|
-
"sheetName": ws.title,
|
1666
|
-
"sheetType": "DialogOrMacroSheet",
|
1667
|
-
"usedRange": None,
|
1668
|
-
})
|
1669
|
-
|
1670
|
-
# 如果是其他类型的工作表,提供基础摘要
|
1671
|
-
else:
|
1672
|
-
summary = ({
|
1673
|
-
"sheetName": ws.title,
|
1674
|
-
"sheetType": ws.__class__.__name__ # 使用工作表的类名作为类型
|
1675
|
-
})
|
1676
|
-
|
1677
|
-
all_sheets_summary.append(summary)
|
1678
|
-
|
1679
|
-
workbook_summary = {
|
1680
|
-
"fileName": Path(self.path).name if self.path else None,
|
1681
|
-
"sheetNames": wb.sheetnames,
|
1682
|
-
"sheets": all_sheets_summary,
|
1683
|
-
}
|
1684
|
-
|
1685
|
-
return workbook_summary
|
1686
|
-
|
1687
1648
|
|
1688
1649
|
inject_members(XlWorkbook, openpyxl.Workbook)
|
1689
1650
|
|
1690
1651
|
|
1691
|
-
def
|
1692
|
-
""" 表格的哈希表达 """
|
1693
|
-
|
1694
|
-
|
1695
|
-
def excel2md5(file, reduction_degree=1):
|
1696
|
-
try:
|
1697
|
-
wb = openpyxl.load_workbook(file)
|
1698
|
-
except (ValueError, TypeError) as e:
|
1699
|
-
# 有些表格直接读取会失败,但使用read_only就能读了
|
1700
|
-
wb = openpyxl.load_workbook(file, read_only=True)
|
1701
|
-
except Exception as e: # 还有其他zipfile.BadZipFile等错误
|
1702
|
-
print(file, str(e))
|
1703
|
-
return ''
|
1704
|
-
|
1705
|
-
return wb.to_md5(reduction_degree)
|
1706
|
-
|
1707
|
-
|
1708
|
-
def __4_extract_summary():
|
1652
|
+
def __3_extract_summary():
|
1709
1653
|
""" 提取表格摘要 """
|
1710
1654
|
|
1711
1655
|
|
@@ -1911,6 +1855,52 @@ def extract_header_structure(ws, header_range):
|
|
1911
1855
|
return header_structure
|
1912
1856
|
|
1913
1857
|
|
1858
|
+
def determine_field_type_and_summary(ws, col, start_row, end_row, rows):
|
1859
|
+
""" 根据指定的列范围确定字段的摘要信息
|
1860
|
+
|
1861
|
+
:param rows: 由外部传入要抽样的数据编号
|
1862
|
+
"""
|
1863
|
+
# 1 需要全量读取数据,获知主要格式,和数值范围
|
1864
|
+
data = defaultdict(list)
|
1865
|
+
for i in range(start_row, end_row + 1):
|
1866
|
+
cell = ws.cell(i, col)
|
1867
|
+
k, v = cell.get_number_format(), cell.value
|
1868
|
+
data[k].append(v)
|
1869
|
+
|
1870
|
+
data2 = sorted(data.items(), key=lambda item: len(item[1]), reverse=True)
|
1871
|
+
number_formats = [x[0] for x in data2]
|
1872
|
+
|
1873
|
+
# 2 获得要展示的样本值
|
1874
|
+
sample_values = []
|
1875
|
+
for i in rows:
|
1876
|
+
cell = ws.cell(i, col)
|
1877
|
+
value = cell.get_render_value()
|
1878
|
+
if isinstance(value, str) and len(value) > 20:
|
1879
|
+
value = value[:17] + '...'
|
1880
|
+
sample_values.append(value)
|
1881
|
+
|
1882
|
+
# 3 数值范围(只要判断主类型的数值范围就行了)
|
1883
|
+
numeric_range = None
|
1884
|
+
for x in data2:
|
1885
|
+
try:
|
1886
|
+
fmt, values = x
|
1887
|
+
values = [v for v in values if (v is not None and not isinstance(v, str))]
|
1888
|
+
numeric_range = [min(values), max(values)]
|
1889
|
+
numeric_range[0] = xl_render_value(numeric_range[0], fmt)
|
1890
|
+
numeric_range[1] = xl_render_value(numeric_range[1], fmt)
|
1891
|
+
break
|
1892
|
+
except (TypeError, ValueError) as e:
|
1893
|
+
pass
|
1894
|
+
|
1895
|
+
summary = {
|
1896
|
+
"number_formats": number_formats,
|
1897
|
+
"numeric_range": numeric_range,
|
1898
|
+
"sample_values": sample_values,
|
1899
|
+
}
|
1900
|
+
|
1901
|
+
return summary
|
1902
|
+
|
1903
|
+
|
1914
1904
|
def extract_cells_content(ws):
|
1915
1905
|
""" 提取一个工作表中的所有单元格内容 """
|
1916
1906
|
cells = {}
|
@@ -1965,52 +1955,6 @@ def extract_field_summaries(ws, header_range, data_range, samples_num=5):
|
|
1965
1955
|
return field_summaries
|
1966
1956
|
|
1967
1957
|
|
1968
|
-
def determine_field_type_and_summary(ws, col, start_row, end_row, rows):
|
1969
|
-
""" 根据指定的列范围确定字段的摘要信息
|
1970
|
-
|
1971
|
-
:param rows: 由外部传入要抽样的数据编号
|
1972
|
-
"""
|
1973
|
-
# 1 需要全量读取数据,获知主要格式,和数值范围
|
1974
|
-
data = defaultdict(list)
|
1975
|
-
for i in range(start_row, end_row + 1):
|
1976
|
-
cell = ws.cell(i, col)
|
1977
|
-
k, v = cell.get_number_format(), cell.value
|
1978
|
-
data[k].append(v)
|
1979
|
-
|
1980
|
-
data2 = sorted(data.items(), key=lambda item: len(item[1]), reverse=True)
|
1981
|
-
number_formats = [x[0] for x in data2]
|
1982
|
-
|
1983
|
-
# 2 获得要展示的样本值
|
1984
|
-
sample_values = []
|
1985
|
-
for i in rows:
|
1986
|
-
cell = ws.cell(i, col)
|
1987
|
-
value = cell.get_render_value()
|
1988
|
-
if isinstance(value, str) and len(value) > 20:
|
1989
|
-
value = value[:17] + '...'
|
1990
|
-
sample_values.append(value)
|
1991
|
-
|
1992
|
-
# 3 数值范围(只要判断主类型的数值范围就行了)
|
1993
|
-
numeric_range = None
|
1994
|
-
for x in data2:
|
1995
|
-
try:
|
1996
|
-
fmt, values = x
|
1997
|
-
values = [v for v in values if (v is not None and not isinstance(v, str))]
|
1998
|
-
numeric_range = [min(values), max(values)]
|
1999
|
-
numeric_range[0] = xl_render_value(numeric_range[0], fmt)
|
2000
|
-
numeric_range[1] = xl_render_value(numeric_range[1], fmt)
|
2001
|
-
break
|
2002
|
-
except (TypeError, ValueError) as e:
|
2003
|
-
pass
|
2004
|
-
|
2005
|
-
summary = {
|
2006
|
-
"number_formats": number_formats,
|
2007
|
-
"numeric_range": numeric_range,
|
2008
|
-
"sample_values": sample_values,
|
2009
|
-
}
|
2010
|
-
|
2011
|
-
return summary
|
2012
|
-
|
2013
|
-
|
2014
1958
|
class WorkbookSummary:
|
2015
1959
|
""" 工作薄摘要相关处理功能 """
|
2016
1960
|
|
@@ -2233,8 +2177,6 @@ def extract_workbook_summary2(file_path, *,
|
|
2233
2177
|
# todo py好像没办法提取Selection。但jsa、vba应该要尽力取出这些相关的特征,尤其在操作等场景很有用
|
2234
2178
|
# res['SelectionAddress'] = ...
|
2235
2179
|
|
2236
|
-
# todo 摘要精简?
|
2237
|
-
|
2238
2180
|
return res
|
2239
2181
|
|
2240
2182
|
|
@@ -2541,10 +2483,91 @@ class WorkbookSummary3:
|
|
2541
2483
|
return y
|
2542
2484
|
|
2543
2485
|
@classmethod
|
2544
|
-
def reduce4b(cls, y, summary_limit_len, *, cur_summary_len=None):
|
2486
|
+
def reduce4b(cls, y, summary_limit_len, *, cur_summary_len=None, active_sheet_weight=0.5):
|
2545
2487
|
"""
|
2488
|
+
:param active_sheet_weight: 当前活动表格被删除的权重,0.5表示按比例被删除的量只有其他表格的一半
|
2546
2489
|
"""
|
2547
|
-
|
2490
|
+
if cur_summary_len is None:
|
2491
|
+
cur_summary_len = len(json.dumps(y, ensure_ascii=False))
|
2492
|
+
|
2493
|
+
active_sheet = y['ActiveSheet']
|
2494
|
+
|
2495
|
+
# 1 预计要删除单元格数
|
2496
|
+
sheet_cells_num = [len(st['cells']) for st in y['sheets']]
|
2497
|
+
# 每个sheet本身其他摘要,按照5个单元格估算
|
2498
|
+
total_cells_num = sum(sheet_cells_num) + len(sheet_cells_num) * 5
|
2499
|
+
avg_cell_len = cur_summary_len / total_cells_num
|
2500
|
+
# 目标删除单元格数量,向上取整
|
2501
|
+
target_reduce_cells_num = int((cur_summary_len - summary_limit_len) / avg_cell_len + 0.5)
|
2502
|
+
|
2503
|
+
# 2 对当前活动表格,会减小删除权重
|
2504
|
+
# 标记当前活动表格的单元格数
|
2505
|
+
active_sheet_index = [i for i, st in enumerate(y['sheets']) if st['sheetName'] == active_sheet][0]
|
2506
|
+
active_cells_num = sheet_cells_num[active_sheet_index]
|
2507
|
+
|
2508
|
+
# 计算权重系数
|
2509
|
+
w = active_sheet_weight # 当前激活表的权重系数
|
2510
|
+
m = active_cells_num
|
2511
|
+
n = total_cells_num
|
2512
|
+
r = target_reduce_cells_num / n
|
2513
|
+
|
2514
|
+
# 计算非活动表格的额外权重系数
|
2515
|
+
w2 = 1 + m * (1 - w) / (n - m)
|
2516
|
+
|
2517
|
+
# 3 所有的单元格如果都不够删,那就先把所有cells删了再说
|
2518
|
+
if total_cells_num < target_reduce_cells_num:
|
2519
|
+
for st in y['sheets']:
|
2520
|
+
st['cells'] = {}
|
2521
|
+
return len(json.dumps(y, ensure_ascii=False))
|
2522
|
+
|
2523
|
+
# 4 否则每张表按照比例删单元格,只保留前面部分的单元格
|
2524
|
+
left_rate = 1 - r # 原始保留比例
|
2525
|
+
while True:
|
2526
|
+
for i, st in enumerate(y['sheets']):
|
2527
|
+
if i == active_sheet_index:
|
2528
|
+
# 当前激活的sheet保留更多单元格
|
2529
|
+
st['cells'] = dict(islice(st['cells'].items(), int(left_rate * w * sheet_cells_num[i])))
|
2530
|
+
else:
|
2531
|
+
# 其他sheet按照w2权重删除单元格
|
2532
|
+
st['cells'] = dict(islice(st['cells'].items(), int(left_rate * w2 * sheet_cells_num[i])))
|
2533
|
+
cur_summary_len = len(json.dumps(y, ensure_ascii=False))
|
2534
|
+
if cur_summary_len <= summary_limit_len:
|
2535
|
+
return cur_summary_len
|
2536
|
+
if left_rate * total_cells_num < 1:
|
2537
|
+
break
|
2538
|
+
else:
|
2539
|
+
left_rate *= 0.8 # 缩小保留比例,再试
|
2540
|
+
|
2541
|
+
return cur_summary_len
|
2542
|
+
|
2543
|
+
@classmethod
|
2544
|
+
def reduce5b(cls, y, summary_limit_len, *, cur_summary_len=None):
|
2545
|
+
""" 计算平均每张表的长度,保留前面部分的表格 """
|
2546
|
+
if cur_summary_len is None:
|
2547
|
+
cur_summary_len = len(json.dumps(y, ensure_ascii=False))
|
2548
|
+
|
2549
|
+
n = len(y['sheets'])
|
2550
|
+
active_sheet_name = y['ActiveSheet']
|
2551
|
+
|
2552
|
+
avg_sheet_len = cur_summary_len / n
|
2553
|
+
# target_reduce_sheet_num = int((cur_summary_len - summary_limit_len) / avg_sheet_len + 0.5)
|
2554
|
+
# y['sheets'] = y['sheets'][:n - target_reduce_sheet_num]
|
2555
|
+
|
2556
|
+
while y['sheets']:
|
2557
|
+
cur_summary_len = len(json.dumps(y, ensure_ascii=False))
|
2558
|
+
if cur_summary_len <= summary_limit_len:
|
2559
|
+
return cur_summary_len
|
2560
|
+
|
2561
|
+
# 如果最后一张表格是激活的表格,尝试删除前一张
|
2562
|
+
if y['sheets'][-1]['sheetName'] == active_sheet_name:
|
2563
|
+
if len(y['sheets']) > 1:
|
2564
|
+
y['sheets'] = y['sheets'][:-2] + [y['sheets'][-1]]
|
2565
|
+
else:
|
2566
|
+
y['sheets'] = []
|
2567
|
+
else:
|
2568
|
+
y['sheets'] = y['sheets'][:-1] # 删除最后一张表格的详细信息
|
2569
|
+
|
2570
|
+
return cur_summary_len
|
2548
2571
|
|
2549
2572
|
@classmethod
|
2550
2573
|
def summary2_to_summary3b(cls, summary2, summary_limit_len=4000):
|
@@ -2585,13 +2608,13 @@ class WorkbookSummary3:
|
|
2585
2608
|
return y
|
2586
2609
|
|
2587
2610
|
# 4 每张表都按比例删除后面部分的单元格
|
2588
|
-
cur_summary_len = cls.
|
2611
|
+
cur_summary_len = cls.reduce4b(y, summary_limit_len, cur_summary_len=cur_summary_len)
|
2589
2612
|
if cur_summary_len <= summary_limit_len:
|
2590
2613
|
y['mode'] = ', '.join(mode_tags[:4])
|
2591
2614
|
return y
|
2592
2615
|
|
2593
2616
|
# 5 从后往前删每张表格的详细信息
|
2594
|
-
cls.
|
2617
|
+
cls.reduce5b(y, summary_limit_len, cur_summary_len=cur_summary_len)
|
2595
2618
|
y['mode'] = ', '.join(mode_tags[:5])
|
2596
2619
|
return y
|
2597
2620
|
|
@@ -2599,8 +2622,8 @@ class WorkbookSummary3:
|
|
2599
2622
|
y = {
|
2600
2623
|
'fileName': x['fileName'],
|
2601
2624
|
'sheetNames': x['sheetNames'],
|
2602
|
-
'ActiveSheet': '', # 当期激活的工作表
|
2603
|
-
'SelectionAddress': '',
|
2625
|
+
'ActiveSheet': x['ActiveSheet'], # 当期激活的工作表
|
2626
|
+
# 'SelectionAddress': '',
|
2604
2627
|
'sheets': x['sheets'],
|
2605
2628
|
'mode': 'Complete information',
|
2606
2629
|
}
|
@@ -2622,7 +2645,7 @@ class WorkbookSummary3:
|
|
2622
2645
|
|
2623
2646
|
def extract_workbook_summary3(file_path, summary_limit_len=4000, **kwargs):
|
2624
2647
|
""" 增加了全局ratio的计算 """
|
2625
|
-
data =
|
2648
|
+
data = extract_workbook_summary2(file_path, **kwargs)
|
2626
2649
|
if not data:
|
2627
2650
|
return data
|
2628
2651
|
data = WorkbookSummary3.summary2_to_summary3(data, summary_limit_len)
|
@@ -2631,7 +2654,7 @@ def extract_workbook_summary3(file_path, summary_limit_len=4000, **kwargs):
|
|
2631
2654
|
|
2632
2655
|
def extract_workbook_summary3b(file_path, summary_limit_len=4000, **kwargs):
|
2633
2656
|
""" 增加了全局ratio的计算 """
|
2634
|
-
data =
|
2657
|
+
data = extract_workbook_summary2(file_path, mode=1, **kwargs)
|
2635
2658
|
if not data:
|
2636
2659
|
return data
|
2637
2660
|
data = WorkbookSummary3.summary2_to_summary3b(data, summary_limit_len)
|
@@ -1000,7 +1000,17 @@ def xlmd5(content):
|
|
1000
1000
|
|
1001
1001
|
@run_once()
|
1002
1002
|
def get_hostname():
|
1003
|
-
|
1003
|
+
hostname = socket.getfqdn()
|
1004
|
+
return hostname
|
1005
|
+
|
1006
|
+
|
1007
|
+
@run_once()
|
1008
|
+
def get_hostname2():
|
1009
|
+
""" 更加定制化的操作 """
|
1010
|
+
hostname = socket.getfqdn()
|
1011
|
+
hostname = hostname.replace('-', '_')
|
1012
|
+
hostname = hostname.split('.')[0]
|
1013
|
+
return hostname
|
1004
1014
|
|
1005
1015
|
|
1006
1016
|
@run_once()
|
@@ -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.89', # 当前版本,每次更新上传到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
|