pyxllib 0.3.109__tar.gz → 0.3.111__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyxllib-0.3.109/pyxllib.egg-info → pyxllib-0.3.111}/PKG-INFO +1 -1
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/pupil.py +30 -14
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/pglib.py +68 -21
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/sqlite.py +22 -3
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/kq5034lib.py +1 -1
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/specialist/filelib.py +79 -21
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/bc.py +5 -2
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/browser.py +8 -2
- {pyxllib-0.3.109 → pyxllib-0.3.111/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.109 → pyxllib-0.3.111}/setup.py +1 -1
- {pyxllib-0.3.109 → pyxllib-0.3.111}/LICENSE +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/MANIFEST.in +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/README.md +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/stat.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/echarts.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/jsonlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/JLineViewer.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/drissionlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/robustprocfile.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/unixlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/ext/yuquelib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/libreoffice.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/file/xlsxlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/multiprocs.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/pupil.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/charclasslib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/newbie.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib.egg-info/SOURCES.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib.egg-info/requires.txt +4 -4
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/gptlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/data/tiktokenlib.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/requirements.txt +0 -0
- {pyxllib-0.3.109 → pyxllib-0.3.111}/setup.cfg +0 -0
@@ -6,8 +6,10 @@
|
|
6
6
|
|
7
7
|
from bisect import bisect_right
|
8
8
|
from collections import defaultdict, Counter
|
9
|
+
import datetime
|
9
10
|
import math
|
10
11
|
import re
|
12
|
+
from statistics import quantiles
|
11
13
|
import sys
|
12
14
|
import textwrap
|
13
15
|
|
@@ -161,6 +163,7 @@ class ValuesStat2:
|
|
161
163
|
from statistics import pstdev, mean
|
162
164
|
|
163
165
|
# 支持输入可能带有非数值类型的raw_values
|
166
|
+
data_type = data_type or ''
|
164
167
|
if raw_values:
|
165
168
|
if 'timestamp' in data_type:
|
166
169
|
values = [x.timestamp() for x in raw_values if hasattr(x, 'timestamp')]
|
@@ -194,7 +197,8 @@ class ValuesStat2:
|
|
194
197
|
def __len__(self):
|
195
198
|
return self.n
|
196
199
|
|
197
|
-
def
|
200
|
+
def _summary(self, unit=None, precision=4, percentile_count=5):
|
201
|
+
""" 返回字典结构的总结 """
|
198
202
|
""" 文本汇总性的报告
|
199
203
|
|
200
204
|
:param percentile_count: 包括两个极值端点的切分点数,
|
@@ -204,8 +208,6 @@ class ValuesStat2:
|
|
204
208
|
:param unit: 展示数值时使用的单位
|
205
209
|
:param precision: 展示数值时的精度
|
206
210
|
"""
|
207
|
-
import datetime
|
208
|
-
from statistics import quantiles
|
209
211
|
|
210
212
|
# 1 各种细分的格式化方法
|
211
213
|
def fmt0(v):
|
@@ -238,19 +240,20 @@ class ValuesStat2:
|
|
238
240
|
fmt = fmtb = fmt1
|
239
241
|
|
240
242
|
# 2 生成统计报告
|
241
|
-
desc =
|
243
|
+
desc = {}
|
242
244
|
if self.raw_n and self.raw_n > self.n:
|
243
|
-
desc
|
245
|
+
desc["总数"] = f"{fmt0(self.n)}/{fmt0(self.raw_n)}≈{self.n / self.raw_n:.2%}"
|
246
|
+
else:
|
247
|
+
desc["总数"] = f"{fmt0(self.n)}"
|
244
248
|
|
245
|
-
desc.append(f"总数:{fmt0(self.n)}")
|
246
249
|
if self.sum is not None:
|
247
|
-
desc
|
250
|
+
desc["总和"] = f"{fmt(self.sum)}"
|
248
251
|
if self.mean is not None and self.std is not None:
|
249
|
-
desc
|
252
|
+
desc["均值±标准差"] = f"{fmt(self.mean)}±{fmtb(self.std)}"
|
250
253
|
elif self.mean is not None:
|
251
|
-
desc
|
254
|
+
desc["均值"] = f"{fmt(self.mean)}"
|
252
255
|
elif self.std is not None:
|
253
|
-
desc
|
256
|
+
desc["标准差"] = f"{fmtb(self.std)}"
|
254
257
|
|
255
258
|
if self.values:
|
256
259
|
dist = [self.values[0]]
|
@@ -259,11 +262,24 @@ class ValuesStat2:
|
|
259
262
|
dist += quartiles
|
260
263
|
dist.append(self.values[-1])
|
261
264
|
|
262
|
-
desc
|
263
|
-
elif self.dist:
|
264
|
-
desc
|
265
|
+
desc["分布"] = '/'.join([fmt(v) for v in dist])
|
266
|
+
elif self.dist:
|
267
|
+
desc["分布"] = '/'.join([fmt(v) for v in self.dist])
|
265
268
|
|
266
|
-
return
|
269
|
+
return desc
|
270
|
+
|
271
|
+
def summary(self, unit=None, precision=4, percentile_count=5):
|
272
|
+
""" 文本汇总性的报告
|
273
|
+
|
274
|
+
:param percentile_count: 包括两个极值端点的切分点数,
|
275
|
+
设置2,就是不设置分位数,就是只展示最小、最大值
|
276
|
+
如果设置了3,就表示"中位数、二分位数",在展示的时候,会显示50%位置的分位数值
|
277
|
+
如果设置了5,就相当于"四分位数",会显示25%、50%、75%位置的分位数值
|
278
|
+
:param unit: 展示数值时使用的单位
|
279
|
+
:param precision: 展示数值时的精度
|
280
|
+
"""
|
281
|
+
desc = self._summary(unit, precision, percentile_count)
|
282
|
+
return '\t'.join([f"{key}: {value}" for key, value in desc.items()])
|
267
283
|
|
268
284
|
def calculate_ratios(self, x_values, fmt=False):
|
269
285
|
""" 计算并返回一个字典,其中包含每个 x_values 中的值与其小于等于该值的元素的比例
|
@@ -45,8 +45,8 @@ from pyxllib.prog.newbie import round_int
|
|
45
45
|
from pyxllib.prog.pupil import utc_now, utc_timestamp
|
46
46
|
from pyxllib.prog.specialist import XlOsEnv
|
47
47
|
from pyxllib.algo.pupil import ValuesStat2
|
48
|
-
from pyxllib.file.specialist import get_etag
|
49
|
-
from pyxllib.data.sqlite import SqlBase,
|
48
|
+
from pyxllib.file.specialist import get_etag, StreamJsonlWriter
|
49
|
+
from pyxllib.data.sqlite import SqlBase, SqlBuilder
|
50
50
|
|
51
51
|
|
52
52
|
class Connection(psycopg.Connection, SqlBase):
|
@@ -154,15 +154,19 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
|
|
154
154
|
第1个值,是一个迭代器,看起来仍然能一条一条返回,实际后台是按照batch_size打包获取的
|
155
155
|
第2个值,是数据总数
|
156
156
|
"""
|
157
|
-
if not isinstance(sql,
|
157
|
+
if not isinstance(sql, SqlBuilder):
|
158
158
|
raise ValueError('暂时只能搭配SQLBuilder使用')
|
159
159
|
|
160
160
|
num = self.exec2one(sql.build_count())
|
161
|
-
|
161
|
+
offset = 0
|
162
162
|
|
163
163
|
def yield_row():
|
164
|
+
nonlocal offset
|
164
165
|
while True:
|
165
|
-
|
166
|
+
sql2 = sql.copy()
|
167
|
+
sql2.limit(batch_size, offset)
|
168
|
+
rows = self.exec2dict(sql2.build_select(), **kwargs).fetchall()
|
169
|
+
offset += batch_size
|
166
170
|
if not rows:
|
167
171
|
break
|
168
172
|
yield from rows
|
@@ -191,8 +195,10 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
|
|
191
195
|
return 'boolean'
|
192
196
|
elif isinstance(val, float):
|
193
197
|
return 'float4'
|
194
|
-
elif isinstance(val, dict):
|
198
|
+
elif isinstance(val, (dict, list)):
|
195
199
|
return 'jsonb'
|
200
|
+
elif isinstance(val, datetime.datetime):
|
201
|
+
return 'timestamp'
|
196
202
|
else: # 其他list等类型,可以用json.dumps或str转文本存储
|
197
203
|
return 'text'
|
198
204
|
|
@@ -256,42 +262,42 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
|
|
256
262
|
def __6_高级统计(self):
|
257
263
|
pass
|
258
264
|
|
259
|
-
def
|
260
|
-
|
265
|
+
def get_column_valuesstat(self, table_name, column, percentile_count=5,
|
266
|
+
filter_condition=None, by_data=False):
|
261
267
|
""" 获得指定表格的某个字段的统计特征ValuesStat2对象
|
262
268
|
|
263
269
|
:param table_name: 表名
|
264
|
-
:param
|
270
|
+
:param column: 用于计算统计数据的字段名
|
265
271
|
:param percentile_count: 分位数的数量,例如 3 表示只计算中位数
|
266
272
|
:param by_data: 是否获得原始数据
|
267
273
|
默认只获得统计特征,不获得原始数据
|
268
274
|
"""
|
269
275
|
|
270
276
|
def init_from_db_data():
|
271
|
-
sql =
|
277
|
+
sql = SqlBuilder(table_name)
|
272
278
|
if filter_condition:
|
273
279
|
sql.where(filter_condition)
|
274
|
-
values = self.exec2col(sql.build_select(
|
280
|
+
values = self.exec2col(sql.build_select(column))
|
275
281
|
if data_type == 'numeric':
|
276
282
|
values = [x and float(x) for x in values]
|
277
283
|
return ValuesStat2(raw_values=values, data_type=data_type)
|
278
284
|
|
279
285
|
def init_from_db():
|
280
286
|
# 1 构建基础的 SQL 查询
|
281
|
-
sql =
|
287
|
+
sql = SqlBuilder(table_name)
|
282
288
|
sql.select("COUNT(*) AS total_count")
|
283
|
-
sql.select(f"COUNT({
|
284
|
-
sql.select(f"MIN({
|
285
|
-
sql.select(f"MAX({
|
286
|
-
if 'timestamp' in data_type:
|
289
|
+
sql.select(f"COUNT({column}) AS non_null_count")
|
290
|
+
sql.select(f"MIN({column}) AS min_value")
|
291
|
+
sql.select(f"MAX({column}) AS max_value")
|
292
|
+
if data_type and 'timestamp' in data_type:
|
287
293
|
percentile_type = 'PERCENTILE_DISC'
|
288
294
|
# todo 其实时间类也可以"泛化"一种平均值、标准差算法的,这需要获取全量数据,然后自己计算
|
289
295
|
elif data_type == 'text':
|
290
296
|
percentile_type = 'PERCENTILE_DISC'
|
291
297
|
else: # 默认是正常的数值类型
|
292
|
-
sql.select(f"SUM({
|
293
|
-
sql.select(f"AVG({
|
294
|
-
sql.select(f"STDDEV({
|
298
|
+
sql.select(f"SUM({column}) AS total_sum")
|
299
|
+
sql.select(f"AVG({column}) AS average")
|
300
|
+
sql.select(f"STDDEV({column}) AS standard_deviation")
|
295
301
|
percentile_type = 'PERCENTILE_CONT'
|
296
302
|
|
297
303
|
percentiles = []
|
@@ -300,7 +306,7 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
|
|
300
306
|
step = 1 / (percentile_count - 1)
|
301
307
|
percentiles = [(i * step) for i in range(1, percentile_count - 1)]
|
302
308
|
for p in percentiles:
|
303
|
-
sql.select(f"{percentile_type}({p:.2f}) WITHIN GROUP (ORDER BY {
|
309
|
+
sql.select(f"{percentile_type}({p:.2f}) WITHIN GROUP (ORDER BY {column}) "
|
304
310
|
f"AS percentile_{int(p * 100)}")
|
305
311
|
|
306
312
|
if filter_condition:
|
@@ -326,7 +332,7 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
|
|
326
332
|
|
327
333
|
return x
|
328
334
|
|
329
|
-
data_type = self.get_column_data_type(table_name,
|
335
|
+
data_type = self.get_column_data_type(table_name, column)
|
330
336
|
if by_data:
|
331
337
|
vs = init_from_db_data()
|
332
338
|
else:
|
@@ -334,6 +340,47 @@ WHERE {table_name}.{item_id_name} = cte.{item_id_name}"""
|
|
334
340
|
|
335
341
|
return vs
|
336
342
|
|
343
|
+
def export_jsonl(self, file_path, table_name, key_col=None, batch_size=1000):
|
344
|
+
""" 将某个表导出为本地jsonl文件
|
345
|
+
|
346
|
+
:param table_name: 表名
|
347
|
+
支持传入SqlBuilder对象,这样可以更灵活的控制导出的数据规则
|
348
|
+
:param file_path: 导出的文件路径
|
349
|
+
:param batch_size: 每次读取的行数和保存的行数
|
350
|
+
:param key_col: 作为主键的列名,如果有的话,会自动去重
|
351
|
+
强烈推荐要设置
|
352
|
+
实际不一定要用主键,只要是有顺序值的列就行
|
353
|
+
|
354
|
+
todo 暴力最简单的版本不难写,我纠结的是缓存机制,还有bytes类型数据会有点大等问题
|
355
|
+
还需要先支持一个通用的缓存写文件功能
|
356
|
+
"""
|
357
|
+
# 1 sql
|
358
|
+
if isinstance(table_name, str):
|
359
|
+
sql = SqlBuilder(table_name)
|
360
|
+
sql.select('*')
|
361
|
+
else:
|
362
|
+
sql = table_name
|
363
|
+
m = re.search(r'FROM (\w+)', sql.build_select())
|
364
|
+
table_name = m.group(1) if m else 'table'
|
365
|
+
assert isinstance(sql, SqlBuilder)
|
366
|
+
|
367
|
+
file_path = XlPath(file_path)
|
368
|
+
if key_col:
|
369
|
+
sql.order_by(key_col)
|
370
|
+
if file_path.is_file():
|
371
|
+
# 读取现有数据,找出主键最大值
|
372
|
+
data = file_path.read_jsonl(batch_size=1000)
|
373
|
+
max_val = max([x[key_col] for x in data]) if data else None
|
374
|
+
if max_val is not None:
|
375
|
+
sql.where(f'{key_col} > {max_val}')
|
376
|
+
|
377
|
+
# 2 获取数据
|
378
|
+
file = StreamJsonlWriter(file_path, batch_size=batch_size) # 流式存储
|
379
|
+
rows, total = self.exec2dict_batch(sql, batch_size=batch_size)
|
380
|
+
for row in tqdm(rows, total=total, desc=table_name):
|
381
|
+
file.append_line(row)
|
382
|
+
file.flush()
|
383
|
+
|
337
384
|
|
338
385
|
"""
|
339
386
|
【关于为什么XlprDb要和pglib合一个文件】
|
@@ -19,7 +19,7 @@ warnings.filterwarnings('ignore', message="pandas only support SQLAlchemy connec
|
|
19
19
|
warnings.filterwarnings('ignore', message="pandas only supports SQLAlchemy connectable")
|
20
20
|
|
21
21
|
|
22
|
-
class
|
22
|
+
class SqlBuilder:
|
23
23
|
def __init__(self, table=''):
|
24
24
|
self.table = table
|
25
25
|
self._select = []
|
@@ -53,6 +53,25 @@ class SQLBuilder:
|
|
53
53
|
self._where.append(condition)
|
54
54
|
return self
|
55
55
|
|
56
|
+
def where_in(self, column, values):
|
57
|
+
if values is None:
|
58
|
+
return self
|
59
|
+
|
60
|
+
if isinstance(values, str):
|
61
|
+
values = [values]
|
62
|
+
values_str = ', '.join(f"'{str(value)}'" for value in values)
|
63
|
+
if len(values) == 1:
|
64
|
+
self._where.append(f"{column} = {values_str[0]}")
|
65
|
+
else:
|
66
|
+
self._where.append(f"{column} IN ({values_str})")
|
67
|
+
return self
|
68
|
+
|
69
|
+
def where_or(self, *conditions):
|
70
|
+
""" 输入的这一批条件,作为OR组合后成为一个整体条件
|
71
|
+
"""
|
72
|
+
self._where.append(f"({' OR '.join(conditions)})")
|
73
|
+
return self
|
74
|
+
|
56
75
|
def group_by(self, *columns):
|
57
76
|
self._group_by.extend(columns)
|
58
77
|
return self
|
@@ -106,7 +125,7 @@ class SQLBuilder:
|
|
106
125
|
return '\n'.join(sql)
|
107
126
|
|
108
127
|
def build_check_data_type(self, column):
|
109
|
-
sql =
|
128
|
+
sql = SqlBuilder('information_schema.columns')
|
110
129
|
sql.select(f"data_type")
|
111
130
|
sql.where(f"table_name='{self.table}' AND column_name='{column}'")
|
112
131
|
return sql.build_select()
|
@@ -381,7 +400,7 @@ class SqlBase:
|
|
381
400
|
|
382
401
|
def get_column_data_type(self, table_name, col_name):
|
383
402
|
""" 获取表格中某一列的数据类型 """
|
384
|
-
return self.exec2one(
|
403
|
+
return self.exec2one(SqlBuilder(table_name).build_check_data_type(col_name))
|
385
404
|
|
386
405
|
|
387
406
|
class Connection(sqlite3.Connection, SqlBase):
|
@@ -1184,30 +1184,46 @@ class XlPath(type(pathlib.Path())):
|
|
1184
1184
|
json.dump(data, f, **kwargs)
|
1185
1185
|
|
1186
1186
|
def read_jsonl(self, encoding='utf8', max_items=None, *,
|
1187
|
-
errors='strict', return_mode
|
1187
|
+
errors='strict', return_mode=0, batch_size=None):
|
1188
1188
|
""" 从文件中读取JSONL格式的数据
|
1189
1189
|
|
1190
1190
|
:param str encoding: 文件编码格式,默认为utf8
|
1191
1191
|
:param str errors: 读取文件时的错误处理方式,默认为strict
|
1192
1192
|
:param bool return_mode: 是否返回文件编码格式,默认为False
|
1193
|
+
0, 读取全量数据返回
|
1194
|
+
1,返回文件编码格式
|
1193
1195
|
:param int max_items: 限制读取的条目数,默认为None,表示读取所有条目
|
1196
|
+
:param int batch_size:
|
1197
|
+
默认为None,表示一次性读取所有数据
|
1198
|
+
如果设置了数值,则会流式读取,常用语太大,超过内存大小等的jsonl文件读取
|
1199
|
+
注意如果设置了大小,只是底层每次一批读取的大小,但返回的data仍然是一维的数据格式迭代器
|
1194
1200
|
:return: 返回读取到的数据列表,如果return_mode为True,则同时返回文件编码格式
|
1195
1201
|
|
1196
1202
|
>> read_jsonl('data.jsonl', max_items=10) # 读取前10条数据
|
1197
1203
|
"""
|
1198
|
-
|
1204
|
+
if batch_size is None:
|
1205
|
+
s, encoding = self.read_text(encoding=encoding, errors=errors, return_mode=True)
|
1206
|
+
|
1207
|
+
data = []
|
1208
|
+
# todo 这一步可能不够严谨,不同的操作系统文件格式不同。但使用splitlines也不太好,在数据含有NEL等特殊字符时会多换行。
|
1209
|
+
for line in s.split('\n'):
|
1210
|
+
if line:
|
1211
|
+
try: # 注意,这里可能会有数据读取失败
|
1212
|
+
data.append(json.loads(line))
|
1213
|
+
except json.decoder.JSONDecodeError:
|
1214
|
+
pass
|
1215
|
+
# 如果达到了限制的条目数,就停止读取
|
1216
|
+
if max_items is not None and len(data) >= max_items:
|
1217
|
+
break
|
1218
|
+
else:
|
1219
|
+
def get_data():
|
1220
|
+
for line in self.yield_line(batch_size, encoding=encoding):
|
1221
|
+
try: # 注意,这里可能会有数据读取失败
|
1222
|
+
yield json.loads(line)
|
1223
|
+
except json.decoder.JSONDecodeError:
|
1224
|
+
pass
|
1199
1225
|
|
1200
|
-
|
1201
|
-
# todo 这一步可能不够严谨,不同的操作系统文件格式不同。但使用splitlines也不太好,在数据含有NEL等特殊字符时会多换行。
|
1202
|
-
for line in s.split('\n'):
|
1203
|
-
if line:
|
1204
|
-
try: # 注意,这里可能会有数据读取失败
|
1205
|
-
data.append(json.loads(line))
|
1206
|
-
except json.decoder.JSONDecodeError:
|
1207
|
-
pass
|
1208
|
-
# 如果达到了限制的条目数,就停止读取
|
1209
|
-
if max_items is not None and len(data) >= max_items:
|
1210
|
-
break
|
1226
|
+
data = get_data()
|
1211
1227
|
|
1212
1228
|
if return_mode:
|
1213
1229
|
return data, encoding
|
@@ -1437,9 +1453,9 @@ class XlPath(type(pathlib.Path())):
|
|
1437
1453
|
dst = XlPath(dst)
|
1438
1454
|
if dst.exist_preprcs(if_exists):
|
1439
1455
|
if self.is_file():
|
1440
|
-
shutil.copy2(self, dst)
|
1456
|
+
return shutil.copy2(self, dst)
|
1441
1457
|
else:
|
1442
|
-
shutil.copytree(self, dst)
|
1458
|
+
return shutil.copytree(self, dst)
|
1443
1459
|
|
1444
1460
|
def move(self, dst, if_exists=None):
|
1445
1461
|
if not self.exists():
|
@@ -1777,7 +1793,7 @@ class XlPath(type(pathlib.Path())):
|
|
1777
1793
|
|
1778
1794
|
return file_summary
|
1779
1795
|
|
1780
|
-
def _check_dir_summary(self, print_mode=True, hash_func=None, run_mode=
|
1796
|
+
def _check_dir_summary(self, print_mode=True, hash_func=None, run_mode=31):
|
1781
1797
|
""" 对文件夹情况进行通用的状态检查
|
1782
1798
|
|
1783
1799
|
:param hash_func: 可以传入自定义的hash函数,用于第四块的重复文件运算
|
@@ -1794,28 +1810,28 @@ class XlPath(type(pathlib.Path())):
|
|
1794
1810
|
|
1795
1811
|
# 一 目录大小,二 各后缀文件大小
|
1796
1812
|
msg = []
|
1797
|
-
if run_mode
|
1813
|
+
if run_mode & 1: # 1和2目前是绑定一起运行的
|
1798
1814
|
printf('【' + self.as_posix() + '】目录检查')
|
1799
1815
|
printf('\n'.join(self.check_size('list')))
|
1800
1816
|
|
1801
1817
|
# 三 重名文件
|
1802
|
-
if run_mode
|
1818
|
+
if run_mode & 2:
|
1803
1819
|
printf('\n三、重名文件(忽略大小写,跨目录检查name重复情况)')
|
1804
1820
|
printf('\n'.join(self.check_repeat_name_files(print_mode=False)))
|
1805
1821
|
|
1806
1822
|
# 四 重复文件
|
1807
|
-
if run_mode
|
1823
|
+
if run_mode & 4:
|
1808
1824
|
printf('\n四、重复文件(etag相同)')
|
1809
1825
|
printf('\n'.join(self.check_repeat_files(print_mode=False, hash_func=hash_func)))
|
1810
1826
|
|
1811
1827
|
# 五 错误扩展名
|
1812
|
-
if run_mode
|
1828
|
+
if run_mode & 8:
|
1813
1829
|
printf('\n五、错误扩展名')
|
1814
1830
|
for i, (f1, suffix2) in enumerate(self.xglob_faker_suffix_files('**/*'), start=1):
|
1815
1831
|
printf(f'{i}、{f1.relpath(self)} -> {suffix2}')
|
1816
1832
|
|
1817
1833
|
# 六 文件配对
|
1818
|
-
if run_mode
|
1834
|
+
if run_mode & 16:
|
1819
1835
|
printf(
|
1820
1836
|
'\n六、文件配对(检查每个目录里stem名称是否配对,列出文件组成不单一的目录结构,请重点检查落单未配对的情况)')
|
1821
1837
|
prompt = False
|
@@ -2091,6 +2107,48 @@ class XlPath(type(pathlib.Path())):
|
|
2091
2107
|
return file
|
2092
2108
|
|
2093
2109
|
|
2110
|
+
class StreamJsonlWriter:
|
2111
|
+
""" 流式存储,主要用于存储文本化、jsonl格式数据 """
|
2112
|
+
|
2113
|
+
def __init__(self, file_path, batch_size=2000, *,
|
2114
|
+
delete_origin_file=False, json_default=str):
|
2115
|
+
self.file_path = XlPath(file_path)
|
2116
|
+
self.cache_text_lines = []
|
2117
|
+
self.batch_size = batch_size
|
2118
|
+
self.total_lines = 0
|
2119
|
+
|
2120
|
+
self.delete_origin_file = delete_origin_file
|
2121
|
+
self.json_default = json_default
|
2122
|
+
|
2123
|
+
def append_line(self, line):
|
2124
|
+
self.append_lines([line])
|
2125
|
+
|
2126
|
+
def append_lines(self, data):
|
2127
|
+
"""
|
2128
|
+
:param list data: 添加一组数据
|
2129
|
+
"""
|
2130
|
+
for x in data:
|
2131
|
+
if isinstance(x, str):
|
2132
|
+
self.cache_text_lines.append(x)
|
2133
|
+
else:
|
2134
|
+
self.cache_text_lines.append(json.dumps(x, ensure_ascii=False,
|
2135
|
+
default=self.json_default))
|
2136
|
+
if len(self.cache_text_lines) >= self.batch_size:
|
2137
|
+
self.flush()
|
2138
|
+
|
2139
|
+
def flush(self):
|
2140
|
+
""" 刷新,将当前缓存写入文件 """
|
2141
|
+
if self.cache_text_lines:
|
2142
|
+
if self.total_lines == 0 and self.delete_origin_file: # 第一次写入时,删除旧缓存文件
|
2143
|
+
self.file_path.delete()
|
2144
|
+
|
2145
|
+
self.total_lines += len(self.cache_text_lines)
|
2146
|
+
self.file_path.parent.mkdir(exist_ok=True, parents=True)
|
2147
|
+
with open(self.file_path, 'a', encoding='utf8') as f:
|
2148
|
+
f.write('\n'.join(self.cache_text_lines) + '\n')
|
2149
|
+
self.cache_text_lines = []
|
2150
|
+
|
2151
|
+
|
2094
2152
|
def demo_file():
|
2095
2153
|
""" File类的综合测试"""
|
2096
2154
|
temp = tempfile.gettempdir()
|
@@ -16,7 +16,10 @@ from pyxllib.file.specialist import File, Dir, filesmatch, get_encoding, XlPath
|
|
16
16
|
# BCompare.exe, bcompare函数要用
|
17
17
|
|
18
18
|
class BCompare(Explorer):
|
19
|
-
def __init__(self, app='
|
19
|
+
def __init__(self, app='bcomp', shell=False):
|
20
|
+
"""
|
21
|
+
240512周日20:06,本来写的是BCompare,但是友鑫mac电脑上发现似乎有问题,所以改成bcomp,这种在windows上也能用
|
22
|
+
"""
|
20
23
|
super().__init__(app, shell)
|
21
24
|
|
22
25
|
@classmethod
|
@@ -48,7 +51,7 @@ class BCompare(Explorer):
|
|
48
51
|
default_suffix = None
|
49
52
|
for i, arg in enumerate(args):
|
50
53
|
f = XlPath.safe_init(arg)
|
51
|
-
if f.is_file(): # 是文件对象,且存在
|
54
|
+
if f is not None and f.is_file(): # 是文件对象,且存在
|
52
55
|
new_args.append(f)
|
53
56
|
if not default_suffix:
|
54
57
|
default_suffix = f.suffix
|
@@ -13,6 +13,7 @@ import subprocess
|
|
13
13
|
import sys
|
14
14
|
import datetime
|
15
15
|
import platform
|
16
|
+
import re
|
16
17
|
|
17
18
|
import pandas as pd
|
18
19
|
from bs4 import BeautifulSoup
|
@@ -118,9 +119,12 @@ class Explorer:
|
|
118
119
|
TODO 获得返回值分析
|
119
120
|
"""
|
120
121
|
args = [self.app] + list(args)
|
122
|
+
|
121
123
|
if 'shell' not in kwargs:
|
122
124
|
kwargs.update({'shell': self.shell})
|
123
|
-
|
125
|
+
if re.match(r'open\s', self.app):
|
126
|
+
args = args[0] + ' ' + args[1]
|
127
|
+
kwargs.update({'shell': True})
|
124
128
|
try:
|
125
129
|
if wait:
|
126
130
|
subprocess.run(args, **kwargs)
|
@@ -161,6 +165,7 @@ class Browser(Explorer):
|
|
161
165
|
# 这里默认设置为 'google-chrome',如果你想使用其他的浏览器,例如Firefox,可以修改为 'firefox'
|
162
166
|
app = 'google-chrome'
|
163
167
|
else:
|
168
|
+
app = 'open -a "Google Chrome"'
|
164
169
|
# 其他系统的处理
|
165
170
|
pass
|
166
171
|
super().__init__(app, shell)
|
@@ -232,7 +237,8 @@ class Browser(Explorer):
|
|
232
237
|
:param file: 默认可以不输入,会按七牛的etag哈希值生成临时文件
|
233
238
|
如果输入,则按照指定的名称生成文件
|
234
239
|
"""
|
235
|
-
|
240
|
+
f = XlPath.safe_init(arg)
|
241
|
+
if f is not None and f.is_file():
|
236
242
|
file = arg
|
237
243
|
else:
|
238
244
|
file = str(self.to_brower_file(arg, file, clsmsg=clsmsg, to_html_args=to_html_args))
|
@@ -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.111', # 当前版本,每次更新上传到pypi都需要修改; 第4位版本号一般是修紧急bug
|
34
34
|
author='code4101',
|
35
35
|
author_email='877362867@qq.com',
|
36
36
|
url='https://github.com/XLPRUtils/pyxllib',
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
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
|