pyxllib 0.3.200__py3-none-any.whl → 3.201.1__py3-none-any.whl
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/__init__.py +0 -7
- pyxllib/algo/geo.py +0 -4
- pyxllib/algo/treelib.py +0 -4
- pyxllib/algo/unitlib.py +0 -4
- pyxllib/autogui/autogui.py +1 -7
- pyxllib/data/echarts.py +0 -4
- pyxllib/data/jsonlib.py +0 -4
- pyxllib/data/pglib.py +1 -17
- pyxllib/ext/demolib.py +6 -1
- pyxllib/ext/robustprocfile.py +0 -4
- pyxllib/ext/unixlib.py +1 -7
- pyxllib/ext/utools.py +0 -6
- pyxllib/ext/wjxlib.py +10 -7
- pyxllib/ext/yuquelib.py +9 -4
- pyxllib/file/docxlib.py +0 -4
- pyxllib/file/movielib.py +0 -4
- pyxllib/file/pdflib.py +0 -4
- pyxllib/file/specialist/__init__.py +0 -4
- pyxllib/file/specialist/filelib.py +0 -4
- pyxllib/file/xlsxlib.py +2 -11
- pyxllib/prog/cachetools.py +1 -7
- pyxllib/prog/pupil.py +11 -0
- pyxllib/prog/specialist/__init__.py +0 -43
- pyxllib/prog/xlosenv.py +2 -0
- pyxllib/text/ahocorasick.py +0 -3
- pyxllib/text/airscript.js +10 -0
- pyxllib/text/jinjalib.py +0 -5
- pyxllib/text/levenshtein.py +2 -2
- pyxllib/text/xmllib.py +0 -6
- pyxllib-3.201.1.dist-info/METADATA +296 -0
- {pyxllib-0.3.200.dist-info → pyxllib-3.201.1.dist-info}/RECORD +33 -34
- pyxllib/ext/old.py +0 -663
- pyxllib-0.3.200.dist-info/METADATA +0 -48
- {pyxllib-0.3.200.dist-info → pyxllib-3.201.1.dist-info}/WHEEL +0 -0
- {pyxllib-0.3.200.dist-info → pyxllib-3.201.1.dist-info}/licenses/LICENSE +0 -0
pyxllib/__init__.py
CHANGED
pyxllib/algo/geo.py
CHANGED
pyxllib/algo/treelib.py
CHANGED
pyxllib/algo/unitlib.py
CHANGED
pyxllib/autogui/autogui.py
CHANGED
@@ -19,13 +19,8 @@ if sys.platform == 'win32':
|
|
19
19
|
import pyautogui
|
20
20
|
import win32gui
|
21
21
|
|
22
|
-
try:
|
23
|
-
import pyscreeze # NOQA pyautogui安装的时候会自动安装依赖的pyscreeze
|
24
|
-
except ModuleNotFoundError:
|
25
|
-
pass
|
26
|
-
|
27
22
|
from pyxllib.prog.newbie import first_nonnone, round_int
|
28
|
-
from pyxllib.prog.pupil import xlwait, DictTool
|
23
|
+
from pyxllib.prog.pupil import xlwait, DictTool
|
29
24
|
from pyxllib.prog.specialist import TicToc
|
30
25
|
from pyxllib.algo.geo import ComputeIou, ltrb2xywh, xywh2ltrb, ltrb2polygon
|
31
26
|
from pyxllib.algo.shapelylib import ShapelyPolygon
|
@@ -646,7 +641,6 @@ def type_text(text):
|
|
646
641
|
|
647
642
|
这种需求一般也可以用剪切板实现,但是剪切板不够独立轻量,可能会有意想不到的副作用
|
648
643
|
"""
|
649
|
-
check_install_package('pynput')
|
650
644
|
from pynput.keyboard import Controller
|
651
645
|
|
652
646
|
keyboard = Controller()
|
pyxllib/data/echarts.py
CHANGED
pyxllib/data/jsonlib.py
CHANGED
pyxllib/data/pglib.py
CHANGED
@@ -8,25 +8,9 @@
|
|
8
8
|
针对PostgreSQL封装的工具
|
9
9
|
"""
|
10
10
|
|
11
|
-
import os
|
12
11
|
import sys
|
13
12
|
|
14
|
-
from pyxllib.
|
15
|
-
from pyxllib.file.specialist import XlPath, ensure_localdir
|
16
|
-
|
17
|
-
# 使用binary安装,好像就不需要自己配置依赖了
|
18
|
-
# if sys.platform == 'win32':
|
19
|
-
# # windows系统中pg的默认安装位置
|
20
|
-
# # https://www.yuque.com/xlpr/pyxllib/install_psycopg
|
21
|
-
# pgdll_dir = XlPath('C:/Program Files/PostgreSQL/14/bin')
|
22
|
-
# if not pgdll_dir.is_dir(): # 换一个自定义目录继续检查
|
23
|
-
# pgdll_dir = XlPath.userdir() / '.xlpr/pgdll'
|
24
|
-
# if not pgdll_dir.is_dir():
|
25
|
-
# print('没有PostgreSQL对应的dll文件,自动下载:')
|
26
|
-
# ensure_localdir(pgdll_dir, 'https://xmutpriu.com/download/pgdll_v14.zip')
|
27
|
-
# os.environ['PATH'] += ';' + pgdll_dir.as_posix()
|
28
|
-
|
29
|
-
check_install_package('psycopg', 'psycopg[binary]')
|
13
|
+
from pyxllib.file.specialist import XlPath
|
30
14
|
|
31
15
|
import io
|
32
16
|
from collections import Counter
|
pyxllib/ext/demolib.py
CHANGED
@@ -15,7 +15,12 @@ test:测试代码,注重分析功能稳定性
|
|
15
15
|
perf:性能测试,注重分析代码的运行效率
|
16
16
|
"""
|
17
17
|
|
18
|
-
|
18
|
+
import re
|
19
|
+
|
20
|
+
from pyxllib.prog.pupil import dprint, dformat
|
21
|
+
from pyxllib.prog.specialist import Timer, TicToc
|
22
|
+
from pyxllib.file.pupil import getfiles
|
23
|
+
from pyxllib.file.specialist import mygetfiles
|
19
24
|
|
20
25
|
____stdlib = """
|
21
26
|
标准库相关
|
pyxllib/ext/robustprocfile.py
CHANGED
pyxllib/ext/unixlib.py
CHANGED
@@ -3,14 +3,8 @@
|
|
3
3
|
# @Author : 陈坤泽
|
4
4
|
# @Email : 877362867@qq.com
|
5
5
|
# @Date : 2021/06/03 20:41
|
6
|
-
import time
|
7
|
-
|
8
|
-
from pyxllib.prog.pupil import check_install_package
|
9
6
|
|
10
|
-
|
11
|
-
check_install_package('scp')
|
12
|
-
# 对 paramiko 进一步封装的库
|
13
|
-
# check_install_package('fabric')
|
7
|
+
import time
|
14
8
|
|
15
9
|
import warnings
|
16
10
|
from cryptography.utils import CryptographyDeprecationWarning
|
pyxllib/ext/utools.py
CHANGED
@@ -6,12 +6,6 @@
|
|
6
6
|
|
7
7
|
""" 专门给utools的快捷命令扩展的一系列python工具库
|
8
8
|
"""
|
9
|
-
from pyxllib.prog.pupil import check_install_package
|
10
|
-
|
11
|
-
check_install_package('fire')
|
12
|
-
check_install_package('humanfriendly')
|
13
|
-
check_install_package('pandas')
|
14
|
-
check_install_package('pyautogui', 'PyAutoGui') # 其实pip install不区分大小写,不过官方这里安装是驼峰名
|
15
9
|
|
16
10
|
import datetime
|
17
11
|
import json
|
pyxllib/ext/wjxlib.py
CHANGED
@@ -21,19 +21,22 @@ class WjxWeb(DpWebBase):
|
|
21
21
|
""" 问卷星网页的爬虫 """
|
22
22
|
|
23
23
|
def __init__(self, url=None):
|
24
|
-
super().__init__(
|
24
|
+
super().__init__('https://www.wjx.cn/login.aspx')
|
25
25
|
self.login()
|
26
|
+
self.tab.get(url)
|
26
27
|
|
27
28
|
def login(self):
|
28
29
|
tab = self.tab
|
29
30
|
|
30
31
|
if tab.url.startswith('https://www.wjx.cn/wjx/activitystat/resultlimit.aspx'):
|
31
|
-
tab('
|
32
|
-
|
33
|
-
if tab.url.
|
34
|
-
tab('
|
35
|
-
tab('
|
36
|
-
tab('
|
32
|
+
tab('t:a@@text():登录').click()
|
33
|
+
|
34
|
+
if tab.url.startswith('https://www.wjx.cn/login.aspx'):
|
35
|
+
tab('t:input@@name=UserName').input(os.getenv('WJX_USERNAME'), clear=True)
|
36
|
+
tab('t:input@@name=Password').input(os.getenv('WJX_PASSWORD'), clear=True)
|
37
|
+
tab('t:label@@for=RememberMe').click()
|
38
|
+
time.sleep(2)
|
39
|
+
tab('t:input@@type=submit').click()
|
37
40
|
|
38
41
|
def get_page_num(self):
|
39
42
|
"""
|
pyxllib/ext/yuquelib.py
CHANGED
@@ -3,23 +3,28 @@
|
|
3
3
|
# @Author : 陈坤泽
|
4
4
|
# @Email : 877362867@qq.com
|
5
5
|
# @Date : 2024/01/01
|
6
|
+
|
7
|
+
import os
|
6
8
|
import html
|
7
9
|
import re
|
8
10
|
import time
|
9
11
|
from enum import Enum
|
12
|
+
import pprint
|
13
|
+
import json
|
10
14
|
|
11
15
|
import requests
|
12
16
|
import urllib.parse
|
17
|
+
import pandas as pd
|
13
18
|
|
14
19
|
from fastcore.basics import GetAttr
|
15
|
-
from
|
20
|
+
from loguru import logger
|
16
21
|
|
17
|
-
from pyxllib.xl import *
|
18
|
-
from pyxllib.algo.stat import *
|
19
22
|
from pyxllib.prog.newbie import SingletonForEveryInitArgs
|
20
|
-
from pyxllib.
|
23
|
+
from pyxllib.prog.pupil import run_once
|
24
|
+
from pyxllib.text.pupil import UrlQueryBuilder, shorten
|
21
25
|
from pyxllib.text.nestenv import NestEnv
|
22
26
|
from pyxllib.text.xmllib import BeautifulSoup, XlBs4Tag
|
27
|
+
from pyxllib.file.specialist import refinepath, XlPath
|
23
28
|
from pyxllib.cv.xlcvlib import xlcv
|
24
29
|
|
25
30
|
|
pyxllib/file/docxlib.py
CHANGED
pyxllib/file/movielib.py
CHANGED
pyxllib/file/pdflib.py
CHANGED
@@ -4,9 +4,6 @@
|
|
4
4
|
# @Email : 877362867@qq.com
|
5
5
|
# @Date : 2020/06/02 16:06
|
6
6
|
|
7
|
-
from pyxllib.prog.pupil import check_install_package
|
8
|
-
|
9
|
-
check_install_package('fitz', 'PyMuPdf>=1.18.17')
|
10
7
|
|
11
8
|
import json
|
12
9
|
import os
|
@@ -91,7 +88,6 @@ class FitzDoc:
|
|
91
88
|
|
92
89
|
def to_docx(self, docx_file=None):
|
93
90
|
""" pdf转docx """
|
94
|
-
check_install_package('pdf2docx')
|
95
91
|
from pdf2docx import parse
|
96
92
|
|
97
93
|
pdf_file = self.src_file
|
@@ -4,9 +4,6 @@
|
|
4
4
|
# @Email : 877362867@qq.com
|
5
5
|
# @Date : 2020/05/30 20:37
|
6
6
|
|
7
|
-
from pyxllib.prog.pupil import check_install_package
|
8
|
-
|
9
|
-
check_install_package('filetype')
|
10
7
|
|
11
8
|
from typing import Callable, Any
|
12
9
|
import io
|
@@ -24,7 +21,6 @@ import math
|
|
24
21
|
from itertools import islice
|
25
22
|
import datetime
|
26
23
|
|
27
|
-
# import chardet
|
28
24
|
import charset_normalizer
|
29
25
|
import qiniu
|
30
26
|
import requests
|
pyxllib/file/xlsxlib.py
CHANGED
@@ -7,18 +7,9 @@
|
|
7
7
|
"""
|
8
8
|
扩展了些自己的openpyxl工具
|
9
9
|
"""
|
10
|
-
import copy
|
11
10
|
|
11
|
+
import copy
|
12
12
|
import time
|
13
|
-
|
14
|
-
from pyxllib.prog.pupil import check_install_package, run_once
|
15
|
-
|
16
|
-
check_install_package('openpyxl')
|
17
|
-
# check_install_package('premailer')
|
18
|
-
# check_install_package('xlrd2')
|
19
|
-
check_install_package('yattag')
|
20
|
-
check_install_package('jsonpickle')
|
21
|
-
|
22
13
|
from collections import Counter, OrderedDict, defaultdict
|
23
14
|
import csv
|
24
15
|
import datetime
|
@@ -48,7 +39,7 @@ except ModuleNotFoundError:
|
|
48
39
|
|
49
40
|
from pyxllib.prog.newbie import human_readable_number
|
50
41
|
from pyxllib.prog.pupil import (inject_members, dprint, xlmd5, shuffle_dict_keys, Timeout,
|
51
|
-
safe_div, format_exception, DictTool)
|
42
|
+
safe_div, format_exception, DictTool, run_once)
|
52
43
|
from pyxllib.prog.specialist import browser, TicToc
|
53
44
|
from pyxllib.algo.specialist import product
|
54
45
|
from pyxllib.text.pupil import calc_chinese_ratio
|
pyxllib/prog/cachetools.py
CHANGED
@@ -4,13 +4,6 @@
|
|
4
4
|
# @Email : 877362867@qq.com
|
5
5
|
# @Date : 2024/05/29
|
6
6
|
|
7
|
-
from pyxllib.prog.pupil import check_install_package
|
8
|
-
|
9
|
-
# cachetools,通用缓存工具,适用范围更广
|
10
|
-
check_install_package('cachetools')
|
11
|
-
# cached-property,类属性特用工具,相对比较简洁些
|
12
|
-
check_install_package('cached_property', 'cached-property')
|
13
|
-
|
14
7
|
# 对于普通函数,一般用lru_cache即可
|
15
8
|
from functools import lru_cache
|
16
9
|
import threading
|
@@ -37,6 +30,7 @@ def xlcache(maxsize=128, *, ttl=None, lock=None, property=False):
|
|
37
30
|
而是外部再加一层@property,不然IDE会识别不了这是一个property,影响开发
|
38
31
|
|
39
32
|
"""
|
33
|
+
|
40
34
|
def decorator(func):
|
41
35
|
if property:
|
42
36
|
if ttl is not None:
|
pyxllib/prog/pupil.py
CHANGED
@@ -386,6 +386,17 @@ class EnchantBase:
|
|
386
386
|
raise NotImplementedError
|
387
387
|
|
388
388
|
|
389
|
+
def check_package(package, speccal_install_name=None):
|
390
|
+
""" 250418周五16:36,check_install_package的简化版本,只检查、报错,提示安装依赖,但不自动进行安装
|
391
|
+
"""
|
392
|
+
try:
|
393
|
+
__import__(package)
|
394
|
+
except ModuleNotFoundError:
|
395
|
+
cmds = [sys.executable, "-m", "pip", "install"]
|
396
|
+
cmds.append(speccal_install_name if speccal_install_name else package)
|
397
|
+
raise ModuleNotFoundError(f'缺少依赖包:{package},请自行安装扩展依赖:{cmds}\n')
|
398
|
+
|
399
|
+
|
389
400
|
def check_install_package(package, speccal_install_name=None, *, user=False):
|
390
401
|
""" https://stackoverflow.com/questions/12332975/installing-python-module-within-code
|
391
402
|
|
@@ -90,49 +90,6 @@ def mtqdm(func, iterable, *args, max_workers=1, check_per_seconds=0.01, **kwargs
|
|
90
90
|
executor.shutdown()
|
91
91
|
|
92
92
|
|
93
|
-
def distribute_package(root, version=None, repository=None, *,
|
94
|
-
upload=True,
|
95
|
-
version_file='setup.py',
|
96
|
-
delete_dist=True):
|
97
|
-
""" 发布包的工具函数
|
98
|
-
|
99
|
-
:param root: 项目的根目录,例如 'D:/slns/pyxllib'
|
100
|
-
根目录下有对应的 setup.py 等文件
|
101
|
-
:param repository: 比如我配置了 [xlpr],就可以传入 'xlpr'
|
102
|
-
:param version_file: 保存版本号的文件,注意看正则规则,需要满足特定的范式,才会自动更新版本号
|
103
|
-
:param delete_dist: 上传完是否自动删除dist目录,要检查上传包是否有遗漏时,要关闭
|
104
|
-
"""
|
105
|
-
import sys
|
106
|
-
from pyxllib.file.specialist import XlPath
|
107
|
-
|
108
|
-
# 1 切换工作目录
|
109
|
-
os.chdir(str(root))
|
110
|
-
|
111
|
-
# 2 改版本号
|
112
|
-
if version:
|
113
|
-
f = XlPath(root) / version_file
|
114
|
-
s = re.sub(r"(version\s*=\s*)(['\"])(.+?)(\2)", fr'\1\g<2>{version}\4', f.read_text())
|
115
|
-
f.write_text(s)
|
116
|
-
|
117
|
-
# 3 打包
|
118
|
-
subprocess.run(f'{sys.executable} setup.py sdist')
|
119
|
-
|
120
|
-
# 4 上传
|
121
|
-
if upload:
|
122
|
-
# 上传
|
123
|
-
cmd = 'twine upload dist/*'
|
124
|
-
if repository:
|
125
|
-
cmd += f' -r {repository}'
|
126
|
-
subprocess.run(cmd)
|
127
|
-
# 删除打包生成的中间文件
|
128
|
-
if delete_dist:
|
129
|
-
XlPath('dist').delete()
|
130
|
-
XlPath('build').delete()
|
131
|
-
|
132
|
-
# 这个不能删,不然importlib会读取不到模块的版本号
|
133
|
-
# [d.delete() for d in XlPath('.').select_dirs(r'*.egg-info')]
|
134
|
-
|
135
|
-
|
136
93
|
def estimate_package_size(package):
|
137
94
|
""" 估计一个库占用的存储大小 """
|
138
95
|
|
pyxllib/prog/xlosenv.py
CHANGED
pyxllib/text/ahocorasick.py
CHANGED
pyxllib/text/airscript.js
CHANGED
@@ -742,3 +742,13 @@ function extendFormatConditionsToFullColumns(ws) {
|
|
742
742
|
}
|
743
743
|
}
|
744
744
|
}
|
745
|
+
|
746
|
+
function 新建一条条件格式() {
|
747
|
+
const ws = ActiveSheet
|
748
|
+
const rng = ws.UsedRange
|
749
|
+
|
750
|
+
const formatConditions = rng.FormatConditions
|
751
|
+
// B列重复值高亮
|
752
|
+
const newCondition = formatConditions.Add(st.XlFormatConditionType.xlCellValue, st.XlFormatConditionOperator.xlEqual, '=B2')
|
753
|
+
|
754
|
+
}
|
pyxllib/text/jinjalib.py
CHANGED
pyxllib/text/levenshtein.py
CHANGED
@@ -4,12 +4,12 @@
|
|
4
4
|
# @Email : 877362867@qq.com
|
5
5
|
# @Date : 2021/06/06 17:01
|
6
6
|
|
7
|
-
from pyxllib.prog.pupil import check_install_package
|
7
|
+
# from pyxllib.prog.pupil import check_install_package
|
8
8
|
|
9
9
|
# 这个需要C++14编译器 https://download.microsoft.com/download/5/f/7/5f7acaeb-8363-451f-9425-68a90f98b238/visualcppbuildtools_full.exe
|
10
10
|
# 在需要的时候安装,防止只是想用pyxllib很简单的功能,但是在pip install阶段处理过于麻烦
|
11
11
|
# MatchSimString计算编辑距离需要
|
12
|
-
check_install_package('Levenshtein', 'python-Levenshtein')
|
12
|
+
# check_install_package('Levenshtein', 'python-Levenshtein')
|
13
13
|
|
14
14
|
from collections import defaultdict
|
15
15
|
from more_itertools import chunked
|
pyxllib/text/xmllib.py
CHANGED
@@ -8,11 +8,6 @@
|
|
8
8
|
xml等网页结构方面的处理
|
9
9
|
"""
|
10
10
|
|
11
|
-
# from pyxllib.prog.pupil import check_install_package
|
12
|
-
|
13
|
-
# 一个xpath解析库
|
14
|
-
# check_install_package('xpath_parser', 'xpath-parser')
|
15
|
-
|
16
11
|
import collections
|
17
12
|
from collections import Counter, defaultdict
|
18
13
|
import re
|
@@ -23,7 +18,6 @@ import pandas as pd
|
|
23
18
|
import bs4
|
24
19
|
from bs4 import BeautifulSoup
|
25
20
|
from humanfriendly import format_size
|
26
|
-
# from xpath_parser import XpathExpression
|
27
21
|
|
28
22
|
from pyxllib.prog.newbie import round_int
|
29
23
|
from pyxllib.prog.pupil import dprint, run_once, inject_members
|