pyxllib 0.3.103__tar.gz → 0.3.104__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.103/pyxllib.egg-info → pyxllib-0.3.104}/PKG-INFO +1 -1
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/data/echarts.py +3 -1
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/data/pglib.py +12 -11
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/data/sqlite.py +39 -3
- pyxllib-0.3.104/pyxllib/ext/drissionlib.py +67 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/kq5034lib.py +9 -14
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/robustprocfile.py +1 -1
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/specialist/filelib.py +43 -10
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/xlsxlib.py +82 -19
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/pupil.py +3 -3
- {pyxllib-0.3.103 → pyxllib-0.3.104/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib.egg-info/SOURCES.txt +1 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/setup.py +1 -1
- {pyxllib-0.3.103 → pyxllib-0.3.104}/LICENSE +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/MANIFEST.in +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/README.md +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/pupil.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/stat.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/data/jsonlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/JLineViewer.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/unixlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/ext/yuquelib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/multiprocs.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/charclasslib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/newbie.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib.egg-info/requires.txt +5 -5
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/gptlib.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/requirements.txt +0 -0
- {pyxllib-0.3.103 → pyxllib-0.3.104}/setup.cfg +0 -0
@@ -58,7 +58,8 @@ class XlChart(Chart):
|
|
58
58
|
kwargs['label']['formatter'] = fmt
|
59
59
|
|
60
60
|
self._append_color(color)
|
61
|
-
self._append_legend(name, is_selected=True)
|
61
|
+
# self._append_legend(name, is_selected=True)
|
62
|
+
self._append_legend(name)
|
62
63
|
|
63
64
|
self.options.get('series').append(
|
64
65
|
{
|
@@ -192,3 +193,4 @@ def draw_pareto_chart(data, accuracy=0.1, *, title='帕累托累积权重', valu
|
|
192
193
|
if __name__ == '__main__':
|
193
194
|
with TicToc(__name__):
|
194
195
|
pass
|
196
|
+
|
@@ -49,6 +49,10 @@ from pyxllib.data.sqlite import SqlBase
|
|
49
49
|
|
50
50
|
class Connection(psycopg.Connection, SqlBase):
|
51
51
|
|
52
|
+
def __init__(self, *args, **kwargs):
|
53
|
+
psycopg.Connection.__init__(self, *args, **kwargs)
|
54
|
+
SqlBase.__init__(self, *args, **kwargs)
|
55
|
+
|
52
56
|
def __1_库(self):
|
53
57
|
pass
|
54
58
|
|
@@ -140,7 +144,7 @@ class Connection(psycopg.Connection, SqlBase):
|
|
140
144
|
def __5_增删改查(self):
|
141
145
|
pass
|
142
146
|
|
143
|
-
def insert_row(self, table_name, cols, *, on_conflict='DO NOTHING', commit=
|
147
|
+
def insert_row(self, table_name, cols, *, on_conflict='DO NOTHING', commit=False):
|
144
148
|
""" 【增】插入新数据
|
145
149
|
|
146
150
|
:param dict cols: 用字典表示的要插入的值
|
@@ -168,11 +172,9 @@ class Connection(psycopg.Connection, SqlBase):
|
|
168
172
|
on_conflict = f'ON CONFLICT {on_conflict}'
|
169
173
|
query += f' {on_conflict}'
|
170
174
|
|
171
|
-
self.
|
172
|
-
if commit:
|
173
|
-
self.commit()
|
175
|
+
self.commit_base(commit, query, params)
|
174
176
|
|
175
|
-
def insert_rows(self, table_name, keys, ls, *, on_conflict='DO NOTHING', commit=
|
177
|
+
def insert_rows(self, table_name, keys, ls, *, on_conflict='DO NOTHING', commit=False):
|
176
178
|
""" 【增】插入新数据
|
177
179
|
|
178
180
|
:param str keys: 要插入的字段名,一个字符串,逗号,隔开属性值
|
@@ -194,9 +196,7 @@ class Connection(psycopg.Connection, SqlBase):
|
|
194
196
|
on_conflict = f'ON CONFLICT {on_conflict}'
|
195
197
|
query += f' {on_conflict}'
|
196
198
|
|
197
|
-
self.
|
198
|
-
if commit:
|
199
|
-
self.commit()
|
199
|
+
self.commit_base(commit, query, params)
|
200
200
|
|
201
201
|
|
202
202
|
"""
|
@@ -392,7 +392,7 @@ class XlprDb(Connection):
|
|
392
392
|
self.insert_row('xlapi', {'input': input, 'output': output,
|
393
393
|
'elapse_ms': elapse_ms, 'update_time': utc_timestamp(8)},
|
394
394
|
on_conflict=on_conflict)
|
395
|
-
|
395
|
+
self.commit()
|
396
396
|
return self.execute('SELECT id FROM xlapi WHERE input=%s', (input,)).fetchone()[0]
|
397
397
|
|
398
398
|
def insert_row2xlserver(self, request, xlapi_id=0, **kwargs):
|
@@ -402,7 +402,7 @@ class XlprDb(Connection):
|
|
402
402
|
'xlapi_id': xlapi_id}
|
403
403
|
kw.update(kwargs)
|
404
404
|
print(kw) # 监控谁在用api
|
405
|
-
self.insert_row('xlserver', kw)
|
405
|
+
self.insert_row('xlserver', kw, commit=True)
|
406
406
|
|
407
407
|
def __3_host_trace相关可视化(self):
|
408
408
|
""" TODO dbview 改名 host_trace """
|
@@ -442,7 +442,8 @@ class XlprDb(Connection):
|
|
442
442
|
|
443
443
|
if status:
|
444
444
|
self.insert_row('host_trace',
|
445
|
-
{'host_name': host_name, 'status': status, 'update_time': utc_timestamp(8)}
|
445
|
+
{'host_name': host_name, 'status': status, 'update_time': utc_timestamp(8)},
|
446
|
+
commit=True)
|
446
447
|
print()
|
447
448
|
|
448
449
|
def _get_host_trace_total(self, mode, title, yaxis_name, date_trunc, recent, host_attr):
|
@@ -8,6 +8,7 @@ import json
|
|
8
8
|
import re
|
9
9
|
import sqlite3
|
10
10
|
import warnings
|
11
|
+
from collections import defaultdict
|
11
12
|
|
12
13
|
import pandas as pd
|
13
14
|
|
@@ -17,6 +18,9 @@ warnings.filterwarnings('ignore', message="pandas only support SQLAlchemy connec
|
|
17
18
|
class SqlBase:
|
18
19
|
""" Sql语法通用的功能 """
|
19
20
|
|
21
|
+
def __init__(self, *args, **kwargs):
|
22
|
+
self._commit_cache = defaultdict(list)
|
23
|
+
|
20
24
|
def __1_库(self):
|
21
25
|
pass
|
22
26
|
|
@@ -84,6 +88,12 @@ class SqlBase:
|
|
84
88
|
cols = ','.join(map(str, cols))
|
85
89
|
self.execute(f'CREATE INDEX {index_name} ON {table_name}({cols})')
|
86
90
|
|
91
|
+
def create_index2(self, table_name, cols):
|
92
|
+
""" 创建一个简单的索引,索引名字自动生成 """
|
93
|
+
if not isinstance(cols, str):
|
94
|
+
cols = ','.join(map(str, cols))
|
95
|
+
self.execute(f'CREATE INDEX idx_{table_name}_{cols.replace(",", "_")} ON {table_name}({cols})')
|
96
|
+
|
87
97
|
def keep_top_n_rows(self, table_name, num, col_name='id'):
|
88
98
|
""" 只保留一小部分数据,常用来做lite、demo数据示例文件
|
89
99
|
|
@@ -155,6 +165,32 @@ class SqlBase:
|
|
155
165
|
def __5_增删改查(self):
|
156
166
|
pass
|
157
167
|
|
168
|
+
def commit_base(self, commit_type, query, params=None):
|
169
|
+
"""
|
170
|
+
:param commit_type:
|
171
|
+
-1,先真正缓存在本地
|
172
|
+
False,传统的事务机制,虽然不会更新数据,但每一条依然会连接数据库,其实速度回挺慢的
|
173
|
+
True,传统的事务机制,但每条都作为独立事务,直接更新了
|
174
|
+
"""
|
175
|
+
if commit_type == -1:
|
176
|
+
self._commit_cache[query].append(params)
|
177
|
+
elif commit_type is False:
|
178
|
+
self.execute(query, params)
|
179
|
+
elif commit_type is True:
|
180
|
+
self.execute(query, params)
|
181
|
+
self.commit()
|
182
|
+
|
183
|
+
def commit_all(self):
|
184
|
+
if not self._commit_cache:
|
185
|
+
self.commit()
|
186
|
+
return
|
187
|
+
|
188
|
+
for query, params in self._commit_cache.items():
|
189
|
+
cur = self.cursor()
|
190
|
+
cur.executemany(query, params)
|
191
|
+
cur.close()
|
192
|
+
self.commit()
|
193
|
+
|
158
194
|
def update_row(self, table_name, cols, where, *, commit=False):
|
159
195
|
""" 【改】更新数据
|
160
196
|
|
@@ -170,9 +206,9 @@ class SqlBase:
|
|
170
206
|
kvs = ','.join([f'{k}=%s' for k in cols.keys()])
|
171
207
|
ops = ' AND '.join([f'{k}=%s' for k in where.keys()])
|
172
208
|
vals = list(cols.values()) + list(where.values())
|
173
|
-
self.
|
174
|
-
|
175
|
-
|
209
|
+
self.commit_base(commit,
|
210
|
+
f'UPDATE {table_name} SET {kvs} WHERE {ops}',
|
211
|
+
self.cvt_types(vals))
|
176
212
|
|
177
213
|
def select_col(self, table_name, col):
|
178
214
|
""" 获得一列数据,常使用的功能,所以做了一个封装
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Author : 陈坤泽
|
4
|
+
# @Email : 877362867@qq.com
|
5
|
+
# @Date : 2024/04/12
|
6
|
+
|
7
|
+
from pyxllib.prog.pupil import check_install_package
|
8
|
+
|
9
|
+
check_install_package('DrissionPage')
|
10
|
+
|
11
|
+
import re
|
12
|
+
from urllib.parse import unquote
|
13
|
+
|
14
|
+
from DrissionPage import ChromiumPage
|
15
|
+
|
16
|
+
|
17
|
+
def get_latest_not_dev_tab(page=None):
|
18
|
+
""" 开发工具本身也会算一个tab,这个函数返回最新的一个不是开发工具的tab """
|
19
|
+
if page is None:
|
20
|
+
page = ChromiumPage()
|
21
|
+
tabs = page.get_tabs()
|
22
|
+
for tab in tabs:
|
23
|
+
if tab.url.startswith('devtools://'):
|
24
|
+
continue
|
25
|
+
return tab
|
26
|
+
|
27
|
+
|
28
|
+
def set_input_text(input_ele, text):
|
29
|
+
""" 因为input输入框可能原本就自带了内容,为了不重复输入,先清空再输入 """
|
30
|
+
input_ele.clear()
|
31
|
+
input_ele.input(text)
|
32
|
+
|
33
|
+
|
34
|
+
def get_download_files(page=None):
|
35
|
+
""" 获取下载列表
|
36
|
+
|
37
|
+
:param search_name: 搜索文件名,输入该参数时,只会从上往下找到第一个匹配的文件
|
38
|
+
否则返回一个list结构,存储下载清单里的文件
|
39
|
+
:return:
|
40
|
+
|
41
|
+
todo 默认应该显示是不全的,有时间可以考虑往下滑动继续检索的功能
|
42
|
+
"""
|
43
|
+
if page is None:
|
44
|
+
page = ChromiumPage()
|
45
|
+
|
46
|
+
files = []
|
47
|
+
page2 = page.new_tab('chrome://downloads/')
|
48
|
+
items = page2('tag:downloads-manager', timeout=1).sr('#mainContainer')('#downloadsList').eles('tag:downloads-item')
|
49
|
+
for item in items:
|
50
|
+
loc = unquote(item.sr('tag:img').attr('src'))
|
51
|
+
file = re.search(r'path=(.+?)(&scale=\d+x)?$', loc).group(1)
|
52
|
+
|
53
|
+
files.append({
|
54
|
+
'file': file,
|
55
|
+
'url': unquote(item.sr('#url').attr('href'))
|
56
|
+
})
|
57
|
+
|
58
|
+
page2.close()
|
59
|
+
|
60
|
+
return files
|
61
|
+
|
62
|
+
|
63
|
+
def search_download_file(file_name):
|
64
|
+
files = get_download_files()
|
65
|
+
for file in files:
|
66
|
+
if file_name in file['file']:
|
67
|
+
return file
|
@@ -45,26 +45,19 @@ class Xiaoetong:
|
|
45
45
|
"""
|
46
46
|
|
47
47
|
def __init__(self):
|
48
|
-
self.app_id = ''
|
49
|
-
self.client_id = ''
|
50
|
-
self.secret_key = ''
|
51
48
|
self.token = ''
|
52
49
|
|
53
50
|
def login(self, app_id, client_id, secret_key):
|
54
51
|
""" 登录,获取token
|
55
52
|
"""
|
56
|
-
self.app_id = app_id
|
57
|
-
self.client_id = client_id
|
58
|
-
self.secret_key = secret_key
|
59
|
-
|
60
53
|
# 启用缓存
|
61
|
-
requests_cache.install_cache('access_token_cache', expire_after=
|
54
|
+
# requests_cache.install_cache('access_token_cache', expire_after=None) # 设置缓存过期时间xx(单位:秒)
|
62
55
|
# 接口地址
|
63
56
|
url = "https://api.xiaoe-tech.com/token"
|
64
57
|
params = {
|
65
|
-
"app_id":
|
66
|
-
"client_id":
|
67
|
-
"secret_key":
|
58
|
+
"app_id": app_id,
|
59
|
+
"client_id": client_id,
|
60
|
+
"secret_key": secret_key,
|
68
61
|
"grant_type": "client_credential"
|
69
62
|
}
|
70
63
|
response = requests.get(url, params=params)
|
@@ -77,7 +70,8 @@ class Xiaoetong:
|
|
77
70
|
raise Exception("Error getting access token: {}".format(result['msg']))
|
78
71
|
else:
|
79
72
|
raise Exception("HTTP request failed with status code {}".format(response.status_code))
|
80
|
-
|
73
|
+
# return result['data']['access_token']
|
74
|
+
|
81
75
|
def get_alive_user_list(self, resource_id, page_size=100):
|
82
76
|
""" 获取直播间用户
|
83
77
|
"""
|
@@ -966,7 +960,8 @@ class 网课考勤2(网课考勤):
|
|
966
960
|
self.xe.login(self.app_id,
|
967
961
|
self.client_id,
|
968
962
|
self.secret_key) # 获取了token
|
969
|
-
|
963
|
+
|
964
|
+
return self.xe.token
|
970
965
|
# 依据课程链接,获取资源id(与课次)
|
971
966
|
def 获取课次与资源id(self):
|
972
967
|
课程链接 = self.课程链接[1:]
|
@@ -1074,7 +1069,7 @@ class 网课考勤2(网课考勤):
|
|
1074
1069
|
self.获取打卡参与用户(activity_id, self.root / "数据表" / path)
|
1075
1070
|
|
1076
1071
|
|
1077
|
-
class
|
1072
|
+
class OldKqDb(Connection):
|
1078
1073
|
""" 五一身心行修考勤工具 """
|
1079
1074
|
|
1080
1075
|
def __init__(self, dbfile='5034.db', wbpath='考勤.xlsx', *args, **kwargs):
|
@@ -107,7 +107,7 @@ def process_dir_base(file_func, dir_path, correct_tag, error_tag,
|
|
107
107
|
|
108
108
|
files = list(dir_path.rglob(pattern))
|
109
109
|
for idx, file in enumerate(files, start=1):
|
110
|
-
tprint(f'
|
110
|
+
tprint(f'处理完第{idx}/{len(files)}个文件: {file.name} ==> {correct_tag}')
|
111
111
|
process_file_base(file_func, file, correct_tag, error_tag,
|
112
112
|
correct_dir=correct_dir, error_dir=error_dir, reset=reset,
|
113
113
|
**kwargs)
|
@@ -1140,12 +1140,12 @@ class XlPath(type(pathlib.Path())):
|
|
1140
1140
|
f = open(self, 'r', encoding=encoding)
|
1141
1141
|
return chunked(f, batch_size)
|
1142
1142
|
|
1143
|
-
def write_text(self, data, encoding='utf8', errors=None, newline=None):
|
1144
|
-
with open(self,
|
1143
|
+
def write_text(self, data, encoding='utf8', mode='w', errors=None, newline=None):
|
1144
|
+
with open(self, mode, encoding=encoding, errors=errors, newline=newline) as f:
|
1145
1145
|
return f.write(data)
|
1146
1146
|
|
1147
|
-
def write_text_unix(self, data, encoding='utf8', errors=None, newline='\n'):
|
1148
|
-
with open(self,
|
1147
|
+
def write_text_unix(self, data, encoding='utf8', mode='w', errors=None, newline='\n'):
|
1148
|
+
with open(self, mode, encoding=encoding, errors=errors, newline=newline) as f:
|
1149
1149
|
return f.write(data)
|
1150
1150
|
|
1151
1151
|
def read_pkl(self):
|
@@ -1214,10 +1214,15 @@ class XlPath(type(pathlib.Path())):
|
|
1214
1214
|
else:
|
1215
1215
|
return data
|
1216
1216
|
|
1217
|
-
def write_jsonl(self, list_data, ensure_ascii=False, default=None):
|
1217
|
+
def write_jsonl(self, list_data, ensure_ascii=False, default=None, mode='w'):
|
1218
1218
|
""" 由于这种格式主要是跟商汤这边对接,就尽量跟它们的格式进行兼容 """
|
1219
1219
|
content = '\n'.join([json.dumps(x, ensure_ascii=ensure_ascii, default=default) for x in list_data])
|
1220
|
-
self.write_text_unix(content + '\n')
|
1220
|
+
self.write_text_unix(content + '\n', mode=mode)
|
1221
|
+
|
1222
|
+
def add_json_line(self, data, ensure_ascii=False, default=None, mode='a'):
|
1223
|
+
""" 在文件末尾添加一行JSON数据 """
|
1224
|
+
content = json.dumps(data, ensure_ascii=ensure_ascii, default=default)
|
1225
|
+
self.write_text_unix(content + '\n', mode=mode)
|
1221
1226
|
|
1222
1227
|
def read_csv(self, encoding='utf8', *, errors='strict', return_mode: bool = False,
|
1223
1228
|
delimiter=',', quotechar='"', **kwargs):
|
@@ -1437,10 +1442,6 @@ class XlPath(type(pathlib.Path())):
|
|
1437
1442
|
shutil.copytree(self, dst)
|
1438
1443
|
|
1439
1444
|
def move(self, dst, if_exists=None):
|
1440
|
-
return self.rename2(dst, if_exists)
|
1441
|
-
|
1442
|
-
def rename2(self, dst, if_exists=None):
|
1443
|
-
""" 相比原版的rename,搞了更多骚操作,但性能也会略微下降,所以重写一个功能名 """
|
1444
1445
|
if not self.exists():
|
1445
1446
|
return self
|
1446
1447
|
|
@@ -1456,6 +1457,34 @@ class XlPath(type(pathlib.Path())):
|
|
1456
1457
|
self.rename(dst)
|
1457
1458
|
return dst
|
1458
1459
|
|
1460
|
+
def rename2(self, new_name, if_exists=None):
|
1461
|
+
""" 相比原版的rename,搞了更多骚操作,但性能也会略微下降,所以重写一个功能名
|
1462
|
+
|
1463
|
+
240416周二12:49,这个接口将真的只做重命名,不做移动!所以将会不再支持dst中出现"/"路径配置
|
1464
|
+
"""
|
1465
|
+
if not self.exists():
|
1466
|
+
return self
|
1467
|
+
|
1468
|
+
if '/' in new_name:
|
1469
|
+
raise ValueError(f'rename2只能做重命名操作,目标路径中不能包含"/"')
|
1470
|
+
elif '\\' in new_name:
|
1471
|
+
raise ValueError(f'rename2只能做重命名操作,目标路径中不能包含"\\"')
|
1472
|
+
|
1473
|
+
if self.name == new_name: # 没有修改名称,跟原来相同
|
1474
|
+
return self
|
1475
|
+
|
1476
|
+
dst = self.parent / new_name
|
1477
|
+
if self == dst:
|
1478
|
+
# 同一个文件,可能是调整了大小写名称
|
1479
|
+
if self.as_posix() != dst.as_posix():
|
1480
|
+
tmp = self.tempfile(dir=self.parent) # self不一定是file,也可能是dir,但这个名称通用
|
1481
|
+
self.rename(tmp)
|
1482
|
+
self.delete()
|
1483
|
+
tmp.rename(dst)
|
1484
|
+
elif dst.exist_preprcs(if_exists):
|
1485
|
+
self.rename(dst)
|
1486
|
+
return dst
|
1487
|
+
|
1459
1488
|
def delete(self):
|
1460
1489
|
if self.is_file():
|
1461
1490
|
os.remove(self)
|
@@ -1621,6 +1650,10 @@ class XlPath(type(pathlib.Path())):
|
|
1621
1650
|
|
1622
1651
|
ext = '.' + t.extension
|
1623
1652
|
ext0 = file_path.suffix
|
1653
|
+
if ext == ext0:
|
1654
|
+
continue
|
1655
|
+
elif ext == '.xls' and ext0 == '.et':
|
1656
|
+
continue
|
1624
1657
|
|
1625
1658
|
if ext0 in ('.docx', '.xlsx', '.pptx', '.xlsm'):
|
1626
1659
|
ext0 = '.zip'
|
@@ -30,6 +30,7 @@ import io
|
|
30
30
|
|
31
31
|
import xlrd
|
32
32
|
|
33
|
+
import filetype
|
33
34
|
import openpyxl
|
34
35
|
from openpyxl import Workbook
|
35
36
|
from openpyxl.cell.cell import MergedCell
|
@@ -351,19 +352,70 @@ def convert_xls_to_xlsx(xls_file):
|
|
351
352
|
|
352
353
|
|
353
354
|
def load_as_xlsx_file(file_path, keep_links=False, keep_vba=False):
|
355
|
+
""" 这个不能全信文件给的扩展名,需要智能判断 """
|
356
|
+
|
357
|
+
# 0 工具函数
|
358
|
+
@run_once()
|
359
|
+
def read_xlsx():
|
360
|
+
file = file_path
|
361
|
+
# 如果文件原本的后缀不是xlsx,openpyxl是读不了的,要绕个弯
|
362
|
+
if file.suffix[1:] not in ('xlsx', 'xlsm'):
|
363
|
+
with open(file_path, 'rb') as f2:
|
364
|
+
data = f2.read()
|
365
|
+
file = io.BytesIO(data)
|
366
|
+
try:
|
367
|
+
return openpyxl.load_workbook(file,
|
368
|
+
keep_links=keep_links,
|
369
|
+
keep_vba=keep_vba)
|
370
|
+
except Exception as e:
|
371
|
+
return
|
372
|
+
|
373
|
+
@run_once()
|
374
|
+
def read_xls():
|
375
|
+
try:
|
376
|
+
return convert_xls_to_xlsx(file_path)
|
377
|
+
except Exception as e:
|
378
|
+
return
|
379
|
+
|
380
|
+
@run_once()
|
381
|
+
def read_csv():
|
382
|
+
try:
|
383
|
+
return convert_csv_to_xlsx(file_path)
|
384
|
+
except Exception as e:
|
385
|
+
return
|
386
|
+
|
387
|
+
def read_test(suffix):
|
388
|
+
if suffix in ('xlsx', 'xlsm', 'zip'):
|
389
|
+
wb = read_xlsx()
|
390
|
+
elif suffix == 'xls':
|
391
|
+
wb = read_xls()
|
392
|
+
elif suffix == 'csv':
|
393
|
+
wb = read_csv()
|
394
|
+
else:
|
395
|
+
wb = None
|
396
|
+
return wb
|
397
|
+
|
398
|
+
# 1 优先相信用户输入的文件名类型
|
354
399
|
file_path = Path(file_path)
|
355
|
-
suffix = file_path.suffix.lower()
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
return
|
366
|
-
|
400
|
+
suffix = file_path.suffix.lower()[1:]
|
401
|
+
wb = read_test(suffix)
|
402
|
+
if wb is not None:
|
403
|
+
return wb, suffix
|
404
|
+
|
405
|
+
# 2 如果处理不了,则尝试用filetype判断的类型
|
406
|
+
suffix2 = filetype.guess(file_path)
|
407
|
+
suffix2 = suffix2.extension if suffix2 else ''
|
408
|
+
wb = read_test(suffix2)
|
409
|
+
if wb is not None:
|
410
|
+
return wb, suffix2
|
411
|
+
|
412
|
+
# 3 如果还处理不了,再把其他可能的情况试一遍
|
413
|
+
for suffix in ('xlsx', 'xls', 'csv'):
|
414
|
+
wb = read_test(suffix)
|
415
|
+
if wb is not None:
|
416
|
+
return wb, suffix
|
417
|
+
|
418
|
+
return None, None
|
367
419
|
|
368
420
|
|
369
421
|
def parse_range_address(address):
|
@@ -552,7 +604,7 @@ class XlCell(openpyxl.cell.cell.Cell): # 适用于 openpyxl.cell.cell.MergedCel
|
|
552
604
|
|
553
605
|
:return: 涉及到合并单元格的情况,新单元格和原单元格已经不一样了,需要重新获取对象
|
554
606
|
"""
|
555
|
-
ct, mid_result = self.celltype(
|
607
|
+
ct, mid_result = self.celltype(return_mode=True)
|
556
608
|
x = self
|
557
609
|
if ct: # 如果是合并单元格,取消该区域的合并单元格
|
558
610
|
rng = mid_result['rng'] if ('rng' in mid_result) else self.in_range()
|
@@ -590,7 +642,7 @@ class XlCell(openpyxl.cell.cell.Cell): # 适用于 openpyxl.cell.cell.MergedCel
|
|
590
642
|
一般这种清空,推荐先将数据库复制到一个临时sheet,再复制回原sheet更安全
|
591
643
|
"""
|
592
644
|
from itertools import product
|
593
|
-
ct, mid_result = self.celltype(
|
645
|
+
ct, mid_result = self.celltype(return_mode=True)
|
594
646
|
|
595
647
|
if ct == 0: # 普通单元格,只复制值和格式
|
596
648
|
dst_cell = dst_cell.clear()
|
@@ -1136,7 +1188,7 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
|
|
1136
1188
|
|
1137
1189
|
return df
|
1138
1190
|
|
1139
|
-
def copy_range(self, src_addr, dst_cell, *, temp_sheet=False,
|
1191
|
+
def copy_range(self, src_addr, dst_cell, *, temp_sheet=False, return_mode=False):
|
1140
1192
|
""" 将自身cell_range区间的内容、格式,拷贝到目标dst_cell里
|
1141
1193
|
|
1142
1194
|
:param str src_addr: 自身的一片单元格范围
|
@@ -1158,7 +1210,7 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
|
|
1158
1210
|
mid_result = {}
|
1159
1211
|
if temp_sheet:
|
1160
1212
|
ws3 = self.parent.create_sheet('__copy_range')
|
1161
|
-
mid_result = self.copy_range(src_addr, ws3['A1'],
|
1213
|
+
mid_result = self.copy_range(src_addr, ws3['A1'], return_mode=True)
|
1162
1214
|
ws1 = ws3
|
1163
1215
|
src_addr = f'A1:{excel_addr(mid_result["n"], mid_result["m"])}'
|
1164
1216
|
else:
|
@@ -1193,7 +1245,7 @@ class XlWorksheet(openpyxl.worksheet.worksheet.Worksheet):
|
|
1193
1245
|
if temp_sheet:
|
1194
1246
|
self.parent.remove(ws1)
|
1195
1247
|
|
1196
|
-
if
|
1248
|
+
if return_mode:
|
1197
1249
|
return mid_result
|
1198
1250
|
|
1199
1251
|
def reindex_columns(self, orders):
|
@@ -2411,7 +2463,8 @@ def extract_workbook_summary2(file_path, *,
|
|
2411
2463
|
res = {}
|
2412
2464
|
res['fileName'] = file_path.name
|
2413
2465
|
start_time = time.time()
|
2414
|
-
wb = load_as_xlsx_file(file_path, keep_links=keep_links, keep_vba=keep_vba)
|
2466
|
+
wb, suffix = load_as_xlsx_file(file_path, keep_links=keep_links, keep_vba=keep_vba)
|
2467
|
+
res['fileType'] = suffix or 'error'
|
2415
2468
|
load_time = time.time() - start_time
|
2416
2469
|
if wb is None: # 不支持的文件类型,不报错,只是返回最基本的文件名信息
|
2417
2470
|
if return_mode == 1:
|
@@ -2459,7 +2512,7 @@ def update_raw_summary2(data):
|
|
2459
2512
|
|
2460
2513
|
# 3 判断键值顺序
|
2461
2514
|
keys = list(data.keys())
|
2462
|
-
ref_keys = ['fileName', 'chineseContentRatio', 'nonEmptyCellRatio', 'sheetNames', 'sheets']
|
2515
|
+
ref_keys = ['fileName', 'fileType', 'chineseContentRatio', 'nonEmptyCellRatio', 'sheetNames', 'sheets']
|
2463
2516
|
if keys != ref_keys:
|
2464
2517
|
data = {k: data[k] for k in ref_keys if k in data}
|
2465
2518
|
|
@@ -2883,6 +2936,7 @@ class WorkbookSummary3:
|
|
2883
2936
|
x = summary2
|
2884
2937
|
y = {
|
2885
2938
|
'fileName': x['fileName'],
|
2939
|
+
'fileType': x['fileType'],
|
2886
2940
|
'sheetNames': x['sheetNames'],
|
2887
2941
|
'sheets': x['sheets'],
|
2888
2942
|
'mode': 'Complete information',
|
@@ -2948,6 +3002,13 @@ def extract_workbook_summary3b(file_path,
|
|
2948
3002
|
res['fileName'] = Path(file_path).name
|
2949
3003
|
load_time = summary2_time = summary3_time = -1
|
2950
3004
|
|
3005
|
+
def reduce_summary(summary):
|
3006
|
+
""" 如果转json后的summary超过4K,去掉可能的sheets字段 """
|
3007
|
+
s = json.dumps(summary, ensure_ascii=False)
|
3008
|
+
if len(s) < 4000:
|
3009
|
+
if 'sheets' in summary:
|
3010
|
+
del summary['sheets']
|
3011
|
+
|
2951
3012
|
try:
|
2952
3013
|
with Timeout(timeout_seconds):
|
2953
3014
|
start_time = time.time()
|
@@ -2964,10 +3025,12 @@ def extract_workbook_summary3b(file_path,
|
|
2964
3025
|
if debug:
|
2965
3026
|
raise e
|
2966
3027
|
res['error'] = f'超时,未完成摘要提取:{timeout_seconds}秒'
|
3028
|
+
reduce_summary(res)
|
2967
3029
|
except Exception as e:
|
2968
3030
|
if debug:
|
2969
3031
|
raise e
|
2970
3032
|
res['error'] = f'提取摘要时发生错误:{format_exception(e, 2)}'
|
3033
|
+
reduce_summary(res)
|
2971
3034
|
|
2972
3035
|
if return_mode == 1:
|
2973
3036
|
return res, {'load_time': human_readable_number(load_time),
|
@@ -1145,7 +1145,7 @@ def check_counter(data, top_n=10):
|
|
1145
1145
|
if top_n > 0:
|
1146
1146
|
top_items = data.most_common(top_n)
|
1147
1147
|
max_n = len(data)
|
1148
|
-
print(f"出现次数最多的{min(top_n, max_n)}/{max_n}
|
1148
|
+
print(f"出现次数最多的{min(top_n, max_n)}/{max_n}条数据(频率):")
|
1149
1149
|
for item, count in top_items:
|
1150
1150
|
print(f"\t{item}\t{count}")
|
1151
1151
|
|
@@ -1154,9 +1154,9 @@ def check_counter(data, top_n=10):
|
|
1154
1154
|
count_frequencies = Counter(data.values())
|
1155
1155
|
|
1156
1156
|
# 打印各计数值出现的次数
|
1157
|
-
print("
|
1157
|
+
print("各计数值出现的次数,频率的频率(频率分布):")
|
1158
1158
|
for count, frequency in count_frequencies.most_common():
|
1159
|
-
print(f"\t
|
1159
|
+
print(f"\t{count}\t{frequency}")
|
1160
1160
|
|
1161
1161
|
|
1162
1162
|
def tprint(*args, **kwargs):
|
@@ -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.104', # 当前版本,每次更新上传到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
|