pyxllib 0.3.124__tar.gz → 0.3.126__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.126/MANIFEST.in +4 -0
- {pyxllib-0.3.124/pyxllib.egg-info → pyxllib-0.3.126}/PKG-INFO +1 -1
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/pglib.py +130 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/drissionlib.py +33 -1
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/unixlib.py +6 -0
- pyxllib-0.3.126/pyxllib/ext/yuquelib.py +294 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/xlsxlib.py +24 -19
- pyxllib-0.3.126/pyxllib/text/templates/echart_base.html +11 -0
- pyxllib-0.3.126/pyxllib/text/templates/highlight_code.html +17 -0
- pyxllib-0.3.126/pyxllib/text/templates/latex_editor.html +103 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126/pyxllib.egg-info}/PKG-INFO +1 -1
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib.egg-info/SOURCES.txt +3 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib.egg-info/requires.txt +14 -11
- pyxllib-0.3.126/pyxlpr/openai2/__init__.py +3 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/openai2/_core/chat.py +236 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/setup.py +4 -1
- pyxllib-0.3.124/MANIFEST.in +0 -3
- pyxllib-0.3.124/pyxllib/ext/yuquelib.py +0 -173
- pyxllib-0.3.124/pyxlpr/openai2/__init__.py +0 -3
- {pyxllib-0.3.124 → pyxllib-0.3.126}/LICENSE +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/README.md +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/pupil.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/stat.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/echarts.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/jsonlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/sqlite.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/JLineViewer.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/kq5034lib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/robustprocfile.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/libreoffice.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/file/specialist/filelib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/cachetools.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/multiprocs.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/pupil.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/scheduler.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/charclasslib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/jinjalib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/newbie.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/gptlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/data/tiktokenlib.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/openai2/_core/chat_in_cmd.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/openai2/_core/group_chat.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/openai2/openai2.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/requirements.txt +0 -0
- {pyxllib-0.3.124 → pyxllib-0.3.126}/setup.cfg +0 -0
@@ -801,6 +801,136 @@ class XlprDb(Connection):
|
|
801
801
|
|
802
802
|
return '<body>' + chart.render_embed() + '</body>', sum(all_users_usaged.values())
|
803
803
|
|
804
|
+
# cdx_edit
|
805
|
+
def _get_database_trace_total(self, title, yaxis_name, date_trunc, recent, link_name):
|
806
|
+
ls = self.execute(textwrap.dedent(f"""\
|
807
|
+
WITH cte1 AS(
|
808
|
+
SELECT link_name, jsonb_each(status::jsonb) AS db_data, date_trunc('{date_trunc}', update_time) ttime
|
809
|
+
FROM database_trace WHERE update_time > %s AND link_name = '{link_name}'
|
810
|
+
), cte2 AS(
|
811
|
+
SELECT ttime, link_name, (db_data).key AS table_name, ((db_data).value->> '_total')::bigint AS total
|
812
|
+
FROM cte1
|
813
|
+
)
|
814
|
+
SELECT ttime, jsonb_object_agg(table_name, total) AS aggregated_json,SUM(total) as total
|
815
|
+
FROM cte2
|
816
|
+
GROUP BY ttime
|
817
|
+
ORDER BY ttime"""), ((utc_now(8) - recent).isoformat(timespec='seconds'),)).fetchall()
|
818
|
+
return self.database_create_stack_chart(title, ls, yaxis_name=yaxis_name)
|
819
|
+
|
820
|
+
|
821
|
+
def _get_database_trace_per_host(self, db, title, yaxis_name, date_trunc, recent, link_name):
|
822
|
+
ls = self.execute(textwrap.dedent(f"""\
|
823
|
+
WITH cte1 AS (
|
824
|
+
SELECT link_name, jsonb_each(status::jsonb) AS db_data, date_trunc('{date_trunc}', update_time) ttime
|
825
|
+
FROM database_trace WHERE update_time > %s AND link_name = '{link_name}'
|
826
|
+
), cte2 AS (
|
827
|
+
SELECT ttime, link_name, (db_data).key AS table_name, (db_data).value AS size_text
|
828
|
+
FROM cte1
|
829
|
+
), cte3 AS (
|
830
|
+
SELECT ttime, table_name, each.key AS key, each.value AS value
|
831
|
+
FROM cte2, jsonb_each_text(size_text) AS each(key, value)
|
832
|
+
)
|
833
|
+
SELECT ttime, jsonb_object_agg(key,
|
834
|
+
CASE
|
835
|
+
WHEN key = '_total' THEN NULL
|
836
|
+
ELSE (value::jsonb ->> 'size')::bigint -- Handle other keys as usual
|
837
|
+
END
|
838
|
+
) FILTER (WHERE key != '_total') AS aggregated_result, -- 确保 _total 不在 aggregated_result 中
|
839
|
+
MAX(CASE WHEN key = '_total' THEN value::bigint ELSE NULL END) AS total -- 单独提取 _total 的值
|
840
|
+
FROM cte3
|
841
|
+
WHERE (key = '_total' OR value::jsonb ? 'size') -- Ensure that '_total' is included
|
842
|
+
AND table_name = '{db}'
|
843
|
+
GROUP BY ttime
|
844
|
+
ORDER BY ttime"""), ((utc_now(8) - recent).isoformat(timespec='seconds'),)).fetchall()
|
845
|
+
return self.database_create_stack_chart(title, ls, yaxis_name=yaxis_name)
|
846
|
+
|
847
|
+
def database_create_stack_chart(self, title, ls, *, yaxis_name=''):
|
848
|
+
""" 创建展示表
|
849
|
+
|
850
|
+
:param title: 表格标题
|
851
|
+
:param list ls: n*3,第1列是时间,第3列是总值,第2列是每个用户具体的数据
|
852
|
+
"""
|
853
|
+
from pyecharts.charts import Line
|
854
|
+
all_database_usaged = Counter()
|
855
|
+
last_time = None
|
856
|
+
for x in ls:
|
857
|
+
hours = 0 if last_time is None else ((x[0] - last_time).total_seconds() / 3600)
|
858
|
+
last_time = x[0]
|
859
|
+
for k, v in x[1].items():
|
860
|
+
if k == '_total':
|
861
|
+
continue
|
862
|
+
all_database_usaged[k] += v * hours
|
863
|
+
|
864
|
+
for i, x in enumerate(ls):
|
865
|
+
ct = Counter()
|
866
|
+
for k, v in x[1].items():
|
867
|
+
ct[k] += v
|
868
|
+
ls[i] = (x[0], ct, int(x[2]))
|
869
|
+
|
870
|
+
# 2 转图表可视化
|
871
|
+
def to_list(values):
|
872
|
+
return [(x[0], v) for x, v in zip(ls, values)]
|
873
|
+
|
874
|
+
def pretty_val(v):
|
875
|
+
return round_int(v) if v > 100 else round(v, 2)
|
876
|
+
|
877
|
+
chart = Line()
|
878
|
+
chart.set_title(title)
|
879
|
+
chart.options['xAxis'][0].update({'min': ls[0][0], 'type': 'time',
|
880
|
+
# 'minInterval': 3600 * 1000 * 24,
|
881
|
+
'name': '时间', 'nameGap': 50, 'nameLocation': 'middle'})
|
882
|
+
chart.options['yAxis'][0].update({'name': yaxis_name, 'nameGap': 50, 'nameLocation': 'middle'})
|
883
|
+
# 目前是比较暴力的方法调整排版,后续要研究是不是能更自动灵活些
|
884
|
+
chart.options['legend'][0].update({'top': '6%', 'icon': 'pin'})
|
885
|
+
chart.options['grid'] = [{'top': 55 + len(all_database_usaged) * 4 , 'containLabel': True}]
|
886
|
+
chart.options['tooltip'].opts.update({'axisPointer': {'type': 'cross'}, 'trigger': 'item'})
|
887
|
+
|
888
|
+
chart.add_series(f'total {pretty_val(ls[0][2]/1024/1024/1024):g}', to_list([x[2]/1024/1024/1024 for x in ls]), areaStyle={})
|
889
|
+
for database, usaged in all_database_usaged.most_common():
|
890
|
+
usaged = usaged / ((ls[-1][0] - ls[0][0]).total_seconds() / 3600 + 1e-9)
|
891
|
+
chart.add_series(f'{database} {pretty_val(usaged/1024/1024/1024):g}',
|
892
|
+
to_list([x[1].get(database, 0)/1024/1024/1024 for x in ls]),
|
893
|
+
areaStyle={}, stack='Total', emphasis={'focus': 'series'})
|
894
|
+
return '<body>' + chart.render_embed() + '</body>'
|
895
|
+
|
896
|
+
def dbview_xldb1_memory(self,recent=datetime.timedelta(days=30), date_trunc='hour'):
|
897
|
+
from pyxllib.data.echarts import render_echart_html
|
898
|
+
|
899
|
+
db_list = ['st', 'xlpr', 'stdata', 'kq5034', 'ckz']
|
900
|
+
args = ['数据库大小(GB)', date_trunc, recent, 'xldb1']
|
901
|
+
htmltexts = []
|
902
|
+
|
903
|
+
res = self._get_database_trace_total('XLDB1数据库使用近况', *args)
|
904
|
+
htmltexts.append(res)
|
905
|
+
|
906
|
+
data_stats = []
|
907
|
+
for idx,db in enumerate(db_list,start=1):
|
908
|
+
data_stats.append(self._get_database_trace_per_host(db,f'{db}', *args))
|
909
|
+
htmltexts += data_stats
|
910
|
+
|
911
|
+
self.commit()
|
912
|
+
h = render_echart_html('database_cdx', body='<br/>'.join(htmltexts))
|
913
|
+
return h
|
914
|
+
|
915
|
+
def dbview_xldb2_memory(self, recent=datetime.timedelta(days=30), date_trunc='hour'):
|
916
|
+
from pyxllib.data.echarts import render_echart_html
|
917
|
+
|
918
|
+
db_list = ['st', 'ragdata']
|
919
|
+
args = ['数据库大小(GB)', date_trunc, recent, 'xldb2']
|
920
|
+
htmltexts = []
|
921
|
+
|
922
|
+
res = self._get_database_trace_total('XLDB2数据库使用近况', *args)
|
923
|
+
htmltexts.append(res)
|
924
|
+
|
925
|
+
data_stats = []
|
926
|
+
for idx, db in enumerate(db_list, start=1):
|
927
|
+
data_stats.append(self._get_database_trace_per_host(db, f'{db}', *args))
|
928
|
+
htmltexts += data_stats
|
929
|
+
|
930
|
+
self.commit()
|
931
|
+
h = render_echart_html('database_cdx', body='<br/>'.join(htmltexts))
|
932
|
+
return h
|
933
|
+
|
804
934
|
def dbview_cpu(self, recent=datetime.timedelta(days=1), date_trunc='hour'):
|
805
935
|
from pyxllib.data.echarts import render_echart_html
|
806
936
|
|
@@ -51,6 +51,34 @@ def get_dp_page(dp_page=None) -> 'XlPage':
|
|
51
51
|
return ChromiumPage()
|
52
52
|
|
53
53
|
|
54
|
+
def get_dp_tab(dp_page=None) -> 'XlPage':
|
55
|
+
""" 智能获取一个标签页tab
|
56
|
+
|
57
|
+
:param dp_page:
|
58
|
+
默认None, 返回默认的page,一般就是当前页面
|
59
|
+
True, 新建一个page
|
60
|
+
str, 新建一个对应url的page
|
61
|
+
func(tab), 通过规则筛选tab,返回符合条件的第1个tab,否则新建一个tab
|
62
|
+
"""
|
63
|
+
|
64
|
+
if isinstance(dp_page, ChromiumPage):
|
65
|
+
return dp_page.latest_tab
|
66
|
+
elif isinstance(dp_page, ChromiumTab):
|
67
|
+
return dp_page
|
68
|
+
elif callable(dp_page):
|
69
|
+
page0 = ChromiumPage()
|
70
|
+
for tab in page0.get_tabs():
|
71
|
+
if dp_page(tab):
|
72
|
+
return tab
|
73
|
+
return page0.new_tab()
|
74
|
+
elif dp_page is True:
|
75
|
+
return ChromiumPage().new_tab()
|
76
|
+
elif isinstance(dp_page, str):
|
77
|
+
return ChromiumPage().new_tab(dp_page)
|
78
|
+
else:
|
79
|
+
return ChromiumPage().latest_tab
|
80
|
+
|
81
|
+
|
54
82
|
def get_latest_not_dev_tab(page=None):
|
55
83
|
""" 开发工具本身也会算一个tab,这个函数返回最新的一个不是开发工具的tab """
|
56
84
|
if page is None:
|
@@ -74,7 +102,11 @@ def search_download_file(file_name):
|
|
74
102
|
for file in files:
|
75
103
|
if file_name in file['file']: # 正常情况下的匹配
|
76
104
|
return file
|
77
|
-
|
105
|
+
for file in files:
|
106
|
+
file2 = file['file'].replace('+', ' ')
|
107
|
+
if file_name in file2: # 但有时候'+'好像有点特别
|
108
|
+
return file
|
109
|
+
if file_name in re.sub(r'\s+', ' ', file2):
|
78
110
|
return file
|
79
111
|
|
80
112
|
|
@@ -12,6 +12,12 @@ check_install_package('scp')
|
|
12
12
|
# 对 paramiko 进一步封装的库
|
13
13
|
# check_install_package('fabric')
|
14
14
|
|
15
|
+
import warnings
|
16
|
+
from cryptography.utils import CryptographyDeprecationWarning
|
17
|
+
|
18
|
+
# 忽略特定的警告
|
19
|
+
warnings.filterwarnings("ignore", category=CryptographyDeprecationWarning)
|
20
|
+
|
15
21
|
from collections import defaultdict
|
16
22
|
import pathlib
|
17
23
|
import re
|
@@ -0,0 +1,294 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Author : 陈坤泽
|
4
|
+
# @Email : 877362867@qq.com
|
5
|
+
# @Date : 2024/01/01
|
6
|
+
|
7
|
+
|
8
|
+
import requests
|
9
|
+
|
10
|
+
from pyxllib.xl import *
|
11
|
+
from pyxllib.algo.stat import *
|
12
|
+
from pprint import pprint
|
13
|
+
|
14
|
+
from pyxllib.text.nestenv import NestEnv
|
15
|
+
|
16
|
+
|
17
|
+
class Yuque:
|
18
|
+
"""
|
19
|
+
https://www.yuque.com/yuque/developer/openapi
|
20
|
+
语雀请求限制:每小时最多 5000 次请求,每秒最多 100 次请求
|
21
|
+
"""
|
22
|
+
|
23
|
+
def __init__(self, token, user_id=None):
|
24
|
+
self.base_url = "https://www.yuque.com/api/v2"
|
25
|
+
self.headers = {
|
26
|
+
"X-Auth-Token": token,
|
27
|
+
"Content-Type": "application/json"
|
28
|
+
}
|
29
|
+
self._user_id = user_id
|
30
|
+
|
31
|
+
def get_user(self):
|
32
|
+
""" 获取用户信息
|
33
|
+
|
34
|
+
# 获得的内容
|
35
|
+
{'data':
|
36
|
+
{'_serializer': 'v2.user', # 数据序列化版本
|
37
|
+
# 用户头像URL
|
38
|
+
'avatar_url': 'https://cdn.nlark.com/yuque/0/2020/.../d5f8391e-2fdd-4f1b-8ea5-299be8fceecd.png',
|
39
|
+
'books_count': 12, # 知识库数量
|
40
|
+
'created_at': '2018-11-16T07:26:27.000Z', # 账户创建时间
|
41
|
+
'description': '', # 用户描述
|
42
|
+
'followers_count': 54, # 跟随者数量
|
43
|
+
'following_count': 6, # 关注者数量
|
44
|
+
'id': 123456, # 用户唯一标识
|
45
|
+
'login': 'code4101', # 用户登录名
|
46
|
+
'name': '代号4101', # 户昵称或姓名
|
47
|
+
'public': 1, # 用户公开状态,1为公开
|
48
|
+
'public_books_count': 2, # 公开的知识库数量
|
49
|
+
'type': 'User', # 数据类型,这里为'User'
|
50
|
+
'updated_at': '2023-12-31T02:43:16.000Z', # 信息最后更新时间
|
51
|
+
'work_id': ''}}
|
52
|
+
"""
|
53
|
+
url = f"{self.base_url}/user"
|
54
|
+
response = requests.get(url, headers=self.headers)
|
55
|
+
return response.json()
|
56
|
+
|
57
|
+
@property
|
58
|
+
def user_id(self):
|
59
|
+
""" 很多接口需要用到用户ID,这里缓存一下 """
|
60
|
+
if self._user_id is None:
|
61
|
+
self._user_id = self.get_user()['data']['id']
|
62
|
+
return self._user_id
|
63
|
+
|
64
|
+
def __1_知识库操作(self):
|
65
|
+
pass
|
66
|
+
|
67
|
+
@run_once('id,str') # todo 应该有更好的缓存机制,目前这样的实现,需要重启程序才会刷新
|
68
|
+
def get_repos(self, return_mode=0):
|
69
|
+
""" 获取某个用户的知识库列表
|
70
|
+
|
71
|
+
:param int|str return_mode: 返回模式
|
72
|
+
0(默认),返回原始json结构
|
73
|
+
df,df结构
|
74
|
+
nickname2id,获取知识库namespace或昵称到ID的映射
|
75
|
+
"""
|
76
|
+
if return_mode == 0:
|
77
|
+
url = f"{self.base_url}/users/{self.user_id}/repos"
|
78
|
+
response = requests.get(url, headers=self.headers)
|
79
|
+
return response.json()
|
80
|
+
elif return_mode == 'df':
|
81
|
+
data = self.get_repos()
|
82
|
+
columns = ['id', 'name', 'items_count', 'namespace']
|
83
|
+
|
84
|
+
ls = []
|
85
|
+
for d in data['data']:
|
86
|
+
ls.append([d[col] for col in columns])
|
87
|
+
|
88
|
+
df = pd.DataFrame(ls, columns=columns)
|
89
|
+
return df
|
90
|
+
elif return_mode == 'nickname2id': # namespace、name到id的映射(注意这里不考虑)
|
91
|
+
data = self.get_repos()
|
92
|
+
names2id = {d['name']: d['id'] for d in data['data']}
|
93
|
+
# 例如:"日志"知识库的namespace是journal,然后 journal -> 24363220
|
94
|
+
namespace2id = {d['namespace'].split('/')[-1]: d['id'] for d in data['data']}
|
95
|
+
names2id.update(namespace2id)
|
96
|
+
return names2id
|
97
|
+
else:
|
98
|
+
raise ValueError(f'不支持的return_mode={return_mode}')
|
99
|
+
|
100
|
+
def get_repo_id(self, repo_id):
|
101
|
+
""" repo_id支持输入"昵称"来获得实际id
|
102
|
+
"""
|
103
|
+
if isinstance(repo_id, str) and not re.match(r'\d+$', repo_id):
|
104
|
+
repo_id = self.get_repos('nickname2id')[repo_id]
|
105
|
+
return repo_id
|
106
|
+
|
107
|
+
def get_repo_docs(self, repo_id, *, return_mode=0):
|
108
|
+
""" 获取知识库的文档列表
|
109
|
+
|
110
|
+
:param repo_id: 知识库的ID或Namespace(如"日志"是我改成的"journal")
|
111
|
+
:param int|str return_mode: 返回模式
|
112
|
+
0(默认),返回原始json结构
|
113
|
+
-1(df),df结构
|
114
|
+
:return: 文档列表,只能获得最近的100篇文档
|
115
|
+
"""
|
116
|
+
repo_id = self.get_repo_id(repo_id)
|
117
|
+
if return_mode == 0:
|
118
|
+
url = f"{self.base_url}/repos/{repo_id}/docs"
|
119
|
+
response = requests.get(url, headers=self.headers)
|
120
|
+
return response.json()
|
121
|
+
elif return_mode in (-1, 'df'):
|
122
|
+
data = self.get_repo_docs(repo_id)
|
123
|
+
# 按照updated_at降序
|
124
|
+
data['data'].sort(key=lambda x: x['updated_at'], reverse=True)
|
125
|
+
columns = ['id', 'title', 'word_count', 'description', 'updated_at']
|
126
|
+
|
127
|
+
ls = []
|
128
|
+
for d in data['data']:
|
129
|
+
ls.append([d.get(col) for col in columns])
|
130
|
+
|
131
|
+
# ls.sort(key=lambda x: x[0]) # id一般就是创建顺序
|
132
|
+
df = pd.DataFrame(ls, columns=columns)
|
133
|
+
# df['updated_at']把'2024-08-07T06:13:10.000Z'转成datetime,并改到utf8时区
|
134
|
+
df['updated_at'] = pd.to_datetime(df['updated_at']).dt.tz_convert('Asia/Shanghai')
|
135
|
+
# 不显示时区
|
136
|
+
df['updated_at'] = df['updated_at'].dt.strftime('%Y-%m-%d %H:%M:%S')
|
137
|
+
return df
|
138
|
+
else:
|
139
|
+
raise ValueError(f'不支持的return_mode={return_mode}')
|
140
|
+
|
141
|
+
def __2_文档操作(self):
|
142
|
+
pass
|
143
|
+
|
144
|
+
def create_doc(self, repo_id, title, md_content):
|
145
|
+
""" 创建单篇文档,并放到目录开头
|
146
|
+
"""
|
147
|
+
# 1 创建文档
|
148
|
+
repo_id = self.get_repo_id(repo_id)
|
149
|
+
url = f"{self.base_url}/repos/{repo_id}/docs"
|
150
|
+
in_data = {
|
151
|
+
"title": title,
|
152
|
+
"body": md_content,
|
153
|
+
}
|
154
|
+
resp = requests.post(url, json=in_data, headers=self.headers)
|
155
|
+
out_data = resp.json()
|
156
|
+
doc_id = out_data['data']['id']
|
157
|
+
|
158
|
+
# 2 将文档添加到目录中
|
159
|
+
url2 = f"{self.base_url}/repos/{repo_id}/toc"
|
160
|
+
in_data2 = {
|
161
|
+
"action": "prependNode", # 默认添加到知识库目录最顶上的位置
|
162
|
+
"action_mode": "child",
|
163
|
+
"doc_id": doc_id,
|
164
|
+
}
|
165
|
+
resp2 = requests.put(url2, json=in_data2, headers=self.headers)
|
166
|
+
out_data2 = resp2.json()
|
167
|
+
|
168
|
+
return out_data2
|
169
|
+
|
170
|
+
def get_doc(self, repo_id, doc_id):
|
171
|
+
""" 获取单篇文档的详细信息
|
172
|
+
|
173
|
+
:param repo_id: 知识库的ID或Namespace
|
174
|
+
:param doc_id: 文档的ID
|
175
|
+
:return: 文档的详细信息
|
176
|
+
"""
|
177
|
+
repo_id = self.get_repo_id(repo_id)
|
178
|
+
url = f"{self.base_url}/repos/{repo_id}/docs/{doc_id}"
|
179
|
+
response = requests.get(url, headers=self.headers)
|
180
|
+
return response.json()
|
181
|
+
|
182
|
+
def get_doc_from_url(self, url, return_mode='md'):
|
183
|
+
""" 从文档的URL中获取文档的详细信息
|
184
|
+
|
185
|
+
:param url: 文档的URL
|
186
|
+
:param return_mode: 返回模式,
|
187
|
+
json, 为原始json结构
|
188
|
+
md, 返回文档的主体md内容
|
189
|
+
title_and_md, 返回文档的标题和md内容
|
190
|
+
:return: 文档的详细信息
|
191
|
+
"""
|
192
|
+
repo_slug, doc_slug = url.split('/')[-2:]
|
193
|
+
res = self.get_doc(repo_slug, doc_slug)
|
194
|
+
|
195
|
+
if return_mode == 'json':
|
196
|
+
return res['data']
|
197
|
+
elif return_mode == 'md':
|
198
|
+
return res['data']['body']
|
199
|
+
elif return_mode == 'title_and_md':
|
200
|
+
return f'文章标题:{res["data"]["title"]}\n\n{res["data"]["body"]}'
|
201
|
+
|
202
|
+
def export_markdown(self, url, output_dir=None, post_mode=1):
|
203
|
+
""" 导出md格式文件
|
204
|
+
|
205
|
+
:param str|list[str] url: 文档的URL
|
206
|
+
可以导出单篇文档,也可以打包批量导出多篇文档的md文件
|
207
|
+
:param output_dir: 导出目录
|
208
|
+
单篇的文件名是按照文章标题自动生成的
|
209
|
+
多篇的可以自己指定具体文件名
|
210
|
+
:param post_mode: 后处理模式
|
211
|
+
0,不做处理
|
212
|
+
1,做适当的精简
|
213
|
+
"""
|
214
|
+
# 1 获得内容
|
215
|
+
data = self.get_doc_from_url(url, return_mode='json')
|
216
|
+
body = data['body']
|
217
|
+
if post_mode == 0:
|
218
|
+
pass
|
219
|
+
elif post_mode == 1:
|
220
|
+
body = re.sub(r'<a\sname=".*?"></a>\n', '', body)
|
221
|
+
|
222
|
+
# 2 写入文件
|
223
|
+
if output_dir is not None:
|
224
|
+
title2 = refinepath(data['title'])
|
225
|
+
f = XlPath(output_dir) / f'{title2}.md'
|
226
|
+
f.write_text(body)
|
227
|
+
|
228
|
+
return body
|
229
|
+
|
230
|
+
def update_doc(self, repo_id, doc_id, doc_data):
|
231
|
+
""" 更新单篇文档的详细信息
|
232
|
+
|
233
|
+
:param repo_id: 知识库的ID或Namespace
|
234
|
+
:param doc_id: 文档的ID
|
235
|
+
:param doc_data: 包含文档更新内容的字典
|
236
|
+
:return: 更新后的文档的详细信息
|
237
|
+
"""
|
238
|
+
repo_id = self.get_repo_id(repo_id)
|
239
|
+
url = f"{self.base_url}/repos/{repo_id}/docs/{doc_id}"
|
240
|
+
response = requests.put(url, json=doc_data, headers=self.headers)
|
241
|
+
return response.json()
|
242
|
+
|
243
|
+
def update_doc_from_url(self, url, doc_data, *, md_cvt=True, return_mode='json'):
|
244
|
+
""" 从文档的URL中更新文档的详细信息
|
245
|
+
|
246
|
+
:param url: 文档的URL
|
247
|
+
:param str|json doc_data: 包含文档更新内容的字典
|
248
|
+
可以直接传入要更新的新的md内容
|
249
|
+
注意无论原始是body_html、body_lake,都是要上传到body字段
|
250
|
+
:param str return_mode: 返回的是更新后文档的内容,不过好像有bug,这里返回的body存储的并不是md格式
|
251
|
+
'md', 返回更新后文档的主体md内容
|
252
|
+
'json', 为原始json结构
|
253
|
+
|
254
|
+
不建议拿这个返回值,完全可以另外再重新取返回值,就是正常的md格式了
|
255
|
+
:param bool md_cvt: 是否需要转换md格式
|
256
|
+
默认的md文档格式直接放回语雀,是会丢失换行的,需要对代码块外的内容,执行\n替换
|
257
|
+
:return: 更新后的文档的详细信息
|
258
|
+
"""
|
259
|
+
# 1 基础配置
|
260
|
+
repo_slug, doc_slug = url.split('/')[-2:]
|
261
|
+
if isinstance(doc_data, str):
|
262
|
+
doc_data = {'body': doc_data}
|
263
|
+
|
264
|
+
# 2 格式转换
|
265
|
+
if md_cvt:
|
266
|
+
ne = NestEnv(doc_data['body']).search(r'^```[^\n]*\n(.+?)\n^```',
|
267
|
+
flags=re.MULTILINE | re.DOTALL).invert()
|
268
|
+
doc_data['body'] = ne.replace('\n', '\n\n')
|
269
|
+
|
270
|
+
# 3 提交更新文档
|
271
|
+
res = self.update_doc(repo_slug, doc_slug, doc_data)
|
272
|
+
|
273
|
+
# 4 拿到返回值
|
274
|
+
if return_mode == 'md':
|
275
|
+
return res['data']
|
276
|
+
elif return_mode == 'json':
|
277
|
+
return res['data']['body']
|
278
|
+
|
279
|
+
def __3_内容操作(self):
|
280
|
+
pass
|
281
|
+
|
282
|
+
def read_tables_from_doc(self, url, header=0):
|
283
|
+
""" 从文档中读取表格
|
284
|
+
|
285
|
+
:param url: 文档的URL
|
286
|
+
:return: 表格列表
|
287
|
+
"""
|
288
|
+
res = self.get_doc_from_url(url, return_mode=0)
|
289
|
+
tables = pd.read_html(res['body_html'], header=header)
|
290
|
+
return tables
|
291
|
+
|
292
|
+
|
293
|
+
if __name__ == '__main__':
|
294
|
+
pass
|
@@ -237,6 +237,8 @@ def xl_render_value(x, xl_fmt):
|
|
237
237
|
注意,遇到公式是很难计算处理的,大概率只能保持原公式显示
|
238
238
|
因为日期用的比较多,需要时常获得真实的渲染效果,所以这里封装一个接口
|
239
239
|
|
240
|
+
对于JSA等场景,直接使用Cell.Text获取渲染值就行,不需要这里这么复杂的实现
|
241
|
+
|
240
242
|
>>> xl_render_value(datetime.datetime(2020, 1, 1), 'yyyy-mm-dd')
|
241
243
|
'2020-01-01'
|
242
244
|
"""
|
@@ -369,56 +371,59 @@ def load_as_xlsx_file(file_path, keep_links=False, keep_vba=False):
|
|
369
371
|
try:
|
370
372
|
return openpyxl.load_workbook(file,
|
371
373
|
keep_links=keep_links,
|
372
|
-
keep_vba=keep_vba)
|
374
|
+
keep_vba=keep_vba), ''
|
373
375
|
except Exception as e:
|
374
|
-
|
376
|
+
if isinstance(e, TimeoutError): # 这里触发的是总的超时设定
|
377
|
+
raise e
|
378
|
+
return None, format_exception(e, 2)
|
375
379
|
|
376
380
|
@run_once()
|
377
381
|
def read_xls():
|
378
382
|
try:
|
379
|
-
return convert_xls_to_xlsx(file_path)
|
383
|
+
return convert_xls_to_xlsx(file_path), ''
|
380
384
|
except Exception as e:
|
381
|
-
return
|
385
|
+
return None, format_exception(e, 2)
|
382
386
|
|
383
387
|
@run_once()
|
384
388
|
def read_csv():
|
385
389
|
try:
|
386
|
-
return convert_csv_to_xlsx(file_path)
|
390
|
+
return convert_csv_to_xlsx(file_path), ''
|
387
391
|
except Exception as e:
|
388
|
-
return
|
392
|
+
return None, format_exception(e, 2)
|
389
393
|
|
390
394
|
def read_test(suffix):
|
391
395
|
if suffix in ('xlsx', 'xlsm', 'zip'):
|
392
|
-
wb = read_xlsx()
|
396
|
+
wb, error = read_xlsx()
|
393
397
|
elif suffix == 'xls':
|
394
|
-
wb = read_xls()
|
398
|
+
wb, error = read_xls()
|
395
399
|
elif suffix == 'csv':
|
396
|
-
wb = read_csv()
|
400
|
+
wb, error = read_csv()
|
397
401
|
else:
|
398
|
-
wb = None
|
399
|
-
return wb
|
402
|
+
wb, error = None, f'不支持的文件类型:{suffix}'
|
403
|
+
return wb, error
|
400
404
|
|
401
405
|
# 1 优先相信用户输入的文件名类型
|
402
406
|
file_path = Path(file_path)
|
403
407
|
suffix = file_path.suffix.lower()[1:]
|
404
|
-
wb = read_test(suffix)
|
408
|
+
wb, error = read_test(suffix)
|
405
409
|
if wb is not None:
|
406
410
|
return wb, suffix
|
407
411
|
|
408
412
|
# 2 如果处理不了,则尝试用filetype判断的类型
|
409
413
|
suffix2 = filetype.guess(file_path)
|
410
414
|
suffix2 = suffix2.extension if suffix2 else ''
|
411
|
-
wb = read_test(suffix2)
|
415
|
+
wb, _ = read_test(suffix2)
|
412
416
|
if wb is not None:
|
413
417
|
return wb, suffix2
|
414
418
|
|
415
419
|
# 3 如果还处理不了,再把其他可能的情况试一遍
|
416
420
|
for suffix in ('xlsx', 'xls', 'csv'):
|
417
|
-
wb = read_test(suffix)
|
421
|
+
wb, _ = read_test(suffix)
|
418
422
|
if wb is not None:
|
419
423
|
return wb, suffix
|
420
424
|
|
421
|
-
|
425
|
+
# 4 确实是处理不了的类型,返回报错信息
|
426
|
+
return None, error
|
422
427
|
|
423
428
|
|
424
429
|
def parse_range_address(address):
|
@@ -2030,7 +2035,7 @@ class XlWorkbook(openpyxl.Workbook):
|
|
2030
2035
|
'cells': extract_cells_content(ws)
|
2031
2036
|
})
|
2032
2037
|
|
2033
|
-
if not summary['cells']: # 如果没有数据,则大概率是数据透视表,是计算出来的,读取不到~
|
2038
|
+
if not summary['cells']: # 如果没有数据,则大概率是数据透视表,是计算出来的,读取不到~ 但是JSA等场景应该有办法获得
|
2034
2039
|
summary['sheetType'] = 'PivotTable'
|
2035
2040
|
del summary['cells']
|
2036
2041
|
else:
|
@@ -2478,10 +2483,10 @@ def extract_workbook_summary2(file_path, *,
|
|
2478
2483
|
res['fileName'] = file_path.name
|
2479
2484
|
start_time = time.time()
|
2480
2485
|
wb, suffix = load_as_xlsx_file(file_path, keep_links=keep_links, keep_vba=keep_vba)
|
2481
|
-
if
|
2482
|
-
res['
|
2486
|
+
if wb is None:
|
2487
|
+
res['error'] = f'Load file error。{suffix}'
|
2483
2488
|
else:
|
2484
|
-
res['
|
2489
|
+
res['fileType'] = suffix
|
2485
2490
|
|
2486
2491
|
load_time = time.time() - start_time
|
2487
2492
|
if wb is None: # 不支持的文件类型,不报错,只是返回最基本的文件名信息
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>{{ title }}</title>
|
5
|
+
<script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script>
|
6
|
+
{% if use_mathjax %}
|
7
|
+
<script src="https://a.cdn.histudy.com/lib/config/mathjax_config-klxx.js?v=1.1"></script>
|
8
|
+
<script type="text/javascript" async="" src="https://a.cdn.histudy.com/lib/mathjax/2.7.1/MathJax/MathJax.js?config=TeX-AMS-MML_SVG">
|
9
|
+
MathJax.Hub.Config(MATHJAX_KLXX_CONFIG);
|
10
|
+
</script>
|
11
|
+
{% else %}
|
12
|
+
{% endif%}
|
13
|
+
</head>
|
14
|
+
<body>
|
15
|
+
{{ body }}
|
16
|
+
</body>
|
17
|
+
</html>
|