pyxllib 0.0.43__py3-none-any.whl → 0.3.197__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.
Files changed (186) hide show
  1. pyxllib/__init__.py +9 -2
  2. pyxllib/algo/__init__.py +8 -0
  3. pyxllib/algo/disjoint.py +54 -0
  4. pyxllib/algo/geo.py +541 -0
  5. pyxllib/{util/mathlib.py → algo/intervals.py} +172 -36
  6. pyxllib/algo/matcher.py +389 -0
  7. pyxllib/algo/newbie.py +166 -0
  8. pyxllib/algo/pupil.py +629 -0
  9. pyxllib/algo/shapelylib.py +67 -0
  10. pyxllib/algo/specialist.py +241 -0
  11. pyxllib/algo/stat.py +494 -0
  12. pyxllib/algo/treelib.py +149 -0
  13. pyxllib/algo/unitlib.py +66 -0
  14. pyxllib/autogui/__init__.py +5 -0
  15. pyxllib/autogui/activewin.py +246 -0
  16. pyxllib/autogui/all.py +9 -0
  17. pyxllib/autogui/autogui.py +852 -0
  18. pyxllib/autogui/uiautolib.py +362 -0
  19. pyxllib/autogui/virtualkey.py +102 -0
  20. pyxllib/autogui/wechat.py +827 -0
  21. pyxllib/autogui/wechat_msg.py +421 -0
  22. pyxllib/autogui/wxautolib.py +84 -0
  23. pyxllib/cv/__init__.py +1 -11
  24. pyxllib/cv/expert.py +267 -0
  25. pyxllib/cv/{imlib.py → imfile.py} +18 -83
  26. pyxllib/cv/imhash.py +39 -0
  27. pyxllib/cv/pupil.py +9 -0
  28. pyxllib/cv/rgbfmt.py +1525 -0
  29. pyxllib/cv/slidercaptcha.py +137 -0
  30. pyxllib/cv/trackbartools.py +163 -49
  31. pyxllib/cv/xlcvlib.py +1040 -0
  32. pyxllib/cv/xlpillib.py +423 -0
  33. pyxllib/data/__init__.py +0 -0
  34. pyxllib/data/echarts.py +240 -0
  35. pyxllib/data/jsonlib.py +89 -0
  36. pyxllib/{util/oss2_.py → data/oss.py} +11 -9
  37. pyxllib/data/pglib.py +1127 -0
  38. pyxllib/data/sqlite.py +568 -0
  39. pyxllib/{util → data}/sqllib.py +13 -31
  40. pyxllib/ext/JLineViewer.py +505 -0
  41. pyxllib/ext/__init__.py +6 -0
  42. pyxllib/{util → ext}/demolib.py +119 -35
  43. pyxllib/ext/drissionlib.py +277 -0
  44. pyxllib/ext/kq5034lib.py +12 -0
  45. pyxllib/{util/main.py → ext/old.py} +122 -284
  46. pyxllib/ext/qt.py +449 -0
  47. pyxllib/ext/robustprocfile.py +497 -0
  48. pyxllib/ext/seleniumlib.py +76 -0
  49. pyxllib/{util/tklib.py → ext/tk.py} +10 -11
  50. pyxllib/ext/unixlib.py +827 -0
  51. pyxllib/ext/utools.py +351 -0
  52. pyxllib/{util/webhooklib.py → ext/webhook.py} +45 -17
  53. pyxllib/ext/win32lib.py +40 -0
  54. pyxllib/ext/wjxlib.py +88 -0
  55. pyxllib/ext/wpsapi.py +124 -0
  56. pyxllib/ext/xlwork.py +9 -0
  57. pyxllib/ext/yuquelib.py +1105 -0
  58. pyxllib/file/__init__.py +17 -0
  59. pyxllib/file/docxlib.py +761 -0
  60. pyxllib/{util → file}/gitlib.py +40 -27
  61. pyxllib/file/libreoffice.py +165 -0
  62. pyxllib/file/movielib.py +148 -0
  63. pyxllib/file/newbie.py +10 -0
  64. pyxllib/file/onenotelib.py +1469 -0
  65. pyxllib/file/packlib/__init__.py +330 -0
  66. pyxllib/{util → file/packlib}/zipfile.py +598 -195
  67. pyxllib/file/pdflib.py +426 -0
  68. pyxllib/file/pupil.py +185 -0
  69. pyxllib/file/specialist/__init__.py +685 -0
  70. pyxllib/{basic/_5_dirlib.py → file/specialist/dirlib.py} +364 -93
  71. pyxllib/file/specialist/download.py +193 -0
  72. pyxllib/file/specialist/filelib.py +2829 -0
  73. pyxllib/file/xlsxlib.py +3131 -0
  74. pyxllib/file/xlsyncfile.py +341 -0
  75. pyxllib/prog/__init__.py +5 -0
  76. pyxllib/prog/cachetools.py +64 -0
  77. pyxllib/prog/deprecatedlib.py +233 -0
  78. pyxllib/prog/filelock.py +42 -0
  79. pyxllib/prog/ipyexec.py +253 -0
  80. pyxllib/prog/multiprogs.py +940 -0
  81. pyxllib/prog/newbie.py +451 -0
  82. pyxllib/prog/pupil.py +1197 -0
  83. pyxllib/{sitepackages.py → prog/sitepackages.py} +5 -3
  84. pyxllib/prog/specialist/__init__.py +391 -0
  85. pyxllib/prog/specialist/bc.py +203 -0
  86. pyxllib/prog/specialist/browser.py +497 -0
  87. pyxllib/prog/specialist/common.py +347 -0
  88. pyxllib/prog/specialist/datetime.py +199 -0
  89. pyxllib/prog/specialist/tictoc.py +240 -0
  90. pyxllib/prog/specialist/xllog.py +180 -0
  91. pyxllib/prog/xlosenv.py +108 -0
  92. pyxllib/stdlib/__init__.py +17 -0
  93. pyxllib/{util → stdlib}/tablepyxl/__init__.py +1 -3
  94. pyxllib/{util → stdlib}/tablepyxl/style.py +1 -1
  95. pyxllib/{util → stdlib}/tablepyxl/tablepyxl.py +2 -4
  96. pyxllib/text/__init__.py +8 -0
  97. pyxllib/text/ahocorasick.py +39 -0
  98. pyxllib/text/airscript.js +744 -0
  99. pyxllib/text/charclasslib.py +121 -0
  100. pyxllib/text/jiebalib.py +267 -0
  101. pyxllib/text/jinjalib.py +32 -0
  102. pyxllib/text/jsa_ai_prompt.md +271 -0
  103. pyxllib/text/jscode.py +922 -0
  104. pyxllib/text/latex/__init__.py +158 -0
  105. pyxllib/text/levenshtein.py +303 -0
  106. pyxllib/text/nestenv.py +1215 -0
  107. pyxllib/text/newbie.py +300 -0
  108. pyxllib/text/pupil/__init__.py +8 -0
  109. pyxllib/text/pupil/common.py +1121 -0
  110. pyxllib/text/pupil/xlalign.py +326 -0
  111. pyxllib/text/pycode.py +47 -0
  112. pyxllib/text/specialist/__init__.py +8 -0
  113. pyxllib/text/specialist/common.py +112 -0
  114. pyxllib/text/specialist/ptag.py +186 -0
  115. pyxllib/text/spellchecker.py +172 -0
  116. pyxllib/text/templates/echart_base.html +11 -0
  117. pyxllib/text/templates/highlight_code.html +17 -0
  118. pyxllib/text/templates/latex_editor.html +103 -0
  119. pyxllib/text/vbacode.py +17 -0
  120. pyxllib/text/xmllib.py +747 -0
  121. pyxllib/xl.py +39 -0
  122. pyxllib/xlcv.py +17 -0
  123. pyxllib-0.3.197.dist-info/METADATA +48 -0
  124. pyxllib-0.3.197.dist-info/RECORD +126 -0
  125. {pyxllib-0.0.43.dist-info → pyxllib-0.3.197.dist-info}/WHEEL +4 -5
  126. pyxllib/basic/_1_strlib.py +0 -945
  127. pyxllib/basic/_2_timelib.py +0 -488
  128. pyxllib/basic/_3_pathlib.py +0 -916
  129. pyxllib/basic/_4_loglib.py +0 -419
  130. pyxllib/basic/__init__.py +0 -54
  131. pyxllib/basic/arrow_.py +0 -250
  132. pyxllib/basic/chardet_.py +0 -66
  133. pyxllib/basic/dirlib.py +0 -529
  134. pyxllib/basic/dprint.py +0 -202
  135. pyxllib/basic/extension.py +0 -12
  136. pyxllib/basic/judge.py +0 -31
  137. pyxllib/basic/log.py +0 -204
  138. pyxllib/basic/pathlib_.py +0 -705
  139. pyxllib/basic/pytictoc.py +0 -102
  140. pyxllib/basic/qiniu_.py +0 -61
  141. pyxllib/basic/strlib.py +0 -761
  142. pyxllib/basic/timer.py +0 -132
  143. pyxllib/cv/cv.py +0 -834
  144. pyxllib/cv/cvlib/_1_geo.py +0 -543
  145. pyxllib/cv/cvlib/_2_cvprcs.py +0 -309
  146. pyxllib/cv/cvlib/_2_imgproc.py +0 -594
  147. pyxllib/cv/cvlib/_3_pilprcs.py +0 -80
  148. pyxllib/cv/cvlib/_4_cvimg.py +0 -211
  149. pyxllib/cv/cvlib/__init__.py +0 -10
  150. pyxllib/cv/debugtools.py +0 -82
  151. pyxllib/cv/fitz_.py +0 -300
  152. pyxllib/cv/installer.py +0 -42
  153. pyxllib/debug/_0_installer.py +0 -38
  154. pyxllib/debug/_1_typelib.py +0 -277
  155. pyxllib/debug/_2_chrome.py +0 -198
  156. pyxllib/debug/_3_showdir.py +0 -161
  157. pyxllib/debug/_4_bcompare.py +0 -140
  158. pyxllib/debug/__init__.py +0 -49
  159. pyxllib/debug/bcompare.py +0 -132
  160. pyxllib/debug/chrome.py +0 -198
  161. pyxllib/debug/installer.py +0 -38
  162. pyxllib/debug/showdir.py +0 -158
  163. pyxllib/debug/typelib.py +0 -278
  164. pyxllib/image/__init__.py +0 -12
  165. pyxllib/torch/__init__.py +0 -20
  166. pyxllib/torch/modellib.py +0 -37
  167. pyxllib/torch/trainlib.py +0 -344
  168. pyxllib/util/__init__.py +0 -20
  169. pyxllib/util/aip_.py +0 -141
  170. pyxllib/util/casiadb.py +0 -59
  171. pyxllib/util/excellib.py +0 -495
  172. pyxllib/util/filelib.py +0 -612
  173. pyxllib/util/jsondata.py +0 -27
  174. pyxllib/util/jsondata2.py +0 -92
  175. pyxllib/util/labelmelib.py +0 -139
  176. pyxllib/util/onepy/__init__.py +0 -29
  177. pyxllib/util/onepy/onepy.py +0 -574
  178. pyxllib/util/onepy/onmanager.py +0 -170
  179. pyxllib/util/pyautogui_.py +0 -219
  180. pyxllib/util/textlib.py +0 -1305
  181. pyxllib/util/unorder.py +0 -22
  182. pyxllib/util/xmllib.py +0 -639
  183. pyxllib-0.0.43.dist-info/METADATA +0 -39
  184. pyxllib-0.0.43.dist-info/RECORD +0 -80
  185. pyxllib-0.0.43.dist-info/top_level.txt +0 -1
  186. {pyxllib-0.0.43.dist-info → pyxllib-0.3.197.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2021/06/09 11:02
6
+
7
+ import logging
8
+ import os
9
+ import shutil
10
+ from typing import Callable, List, Optional
11
+ from urllib import request
12
+
13
+ import requests
14
+ from bs4 import BeautifulSoup
15
+
16
+ from pyxllib.file.specialist import File, Dir, refinepath
17
+
18
+
19
+ def download_file(url, fn=None, *, encoding=None, if_exists=None, ext=None, temp=False):
20
+ r""" 类似writefile,只是源数据是从url里下载
21
+
22
+ :param url: 数据下载链接
23
+ :param fn: 保存位置,会从url智能提取文件名
24
+ :param if_exists: 详见 File.write 参数解释
25
+ :para temp: 将文件写到临时文件夹
26
+ :return:
27
+
28
+ >> download_file(image_url) # 保存在当前工作目录下
29
+ D:/home/chenkunze/slns/xlproject/xlsln/ckz2024/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg
30
+ >> download_file(image_url, fn=r"D:/home/chenkunze/slns/xlproject/xlsln/ckz2024/a.png") # 指定路径
31
+ D:/home/chenkunze/slns/xlproject/xlsln/ckz2024/a.png
32
+ >> download_file(image_url, fn=r"D:/home/chenkunze/slns/xlproject/xlsln/ckz2024") # 暂不支持目录
33
+ ValueError: 不能用目录初始化一个File对象 D:\home\chenkunze\slns\xlproject\xlsln\ckz2023
34
+ """
35
+ if not fn: fn = refinepath(url.split('/')[-1])[-80:] # 这里故意截断文件名最长80个字符
36
+ root = Dir.TEMP if temp else None
37
+ fn = File(fn, root, suffix=ext).write(requests.get(url).content,
38
+ encoding=encoding, if_exists=if_exists, etag=(not fn))
39
+ return fn.to_str()
40
+
41
+
42
+ def read_from_ubuntu(url):
43
+ """从paste.ubuntu.com获取数据"""
44
+ if isinstance(url, int): # 允许输入一个数字ID来获取网页内容
45
+ url = 'https://paste.ubuntu.com/' + str(url) + '/'
46
+ r = requests.get(url)
47
+ soup = BeautifulSoup(r.text, 'lxml')
48
+ content = soup.find_all(name='div', attrs={'class': 'paste'})[2]
49
+ return content.get_text()
50
+
51
+
52
+ def download(
53
+ url: str, dir: str, *, filename: Optional[str] = None, progress: bool = True
54
+ ) -> str:
55
+ """ 取自fvcore:Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
56
+
57
+ Download a file from a given URL to a directory. If file exists, will not
58
+ overwrite the existing file.
59
+
60
+ Args:
61
+ url (str):
62
+ dir (str): the directory to download the file
63
+ filename (str or None): the basename to save the file.
64
+ Will use the name in the URL if not given.
65
+ progress (bool): whether to use tqdm to draw a progress bar.
66
+
67
+ Returns:
68
+ str: the path to the downloaded file or the existing one.
69
+ """
70
+ os.makedirs(dir, exist_ok=True)
71
+ if filename is None:
72
+ filename = url.split("/")[-1]
73
+ assert len(filename), "Cannot obtain filename from url {}".format(url)
74
+ fpath = os.path.join(dir, filename)
75
+ logger = logging.getLogger(__name__)
76
+
77
+ if os.path.isfile(fpath):
78
+ logger.info("File {} exists! Skipping download.".format(filename))
79
+ return fpath
80
+
81
+ tmp = fpath + ".tmp" # download to a tmp file first, to be more atomic.
82
+ try:
83
+ logger.info("Downloading from {} ...".format(url))
84
+ if progress:
85
+ import tqdm
86
+
87
+ def hook(t: tqdm.tqdm) -> Callable[[int, int, Optional[int]], None]:
88
+ last_b: List[int] = [0]
89
+
90
+ def inner(b: int, bsize: int, tsize: Optional[int] = None) -> None:
91
+ if tsize is not None:
92
+ t.total = tsize
93
+ t.update((b - last_b[0]) * bsize) # type: ignore
94
+ last_b[0] = b
95
+
96
+ return inner
97
+
98
+ with tqdm.tqdm( # type: ignore
99
+ unit="B", unit_scale=True, miniters=1, desc=filename, leave=True
100
+ ) as t:
101
+ tmp, _ = request.urlretrieve(url, filename=tmp, reporthook=hook(t))
102
+
103
+ else:
104
+ tmp, _ = request.urlretrieve(url, filename=tmp)
105
+ statinfo = os.stat(tmp)
106
+ size = statinfo.st_size
107
+ if size == 0:
108
+ raise IOError("Downloaded an empty file from {}!".format(url))
109
+ # download to tmp first and move to fpath, to make this function more
110
+ # atomic.
111
+ shutil.move(tmp, fpath)
112
+ except IOError:
113
+ logger.error("Failed to download {}".format(url))
114
+ raise
115
+ finally:
116
+ try:
117
+ os.unlink(tmp)
118
+ except IOError:
119
+ pass
120
+
121
+ logger.info("Successfully downloaded " + fpath + ". " + str(size) + " bytes.")
122
+ return fpath
123
+
124
+
125
+ def ensure_localfile(localfile, from_url, *, if_exists=None, progress=True):
126
+ """ 判断本地文件 localfile 是否存在,如果不存在,自动从指定的 from_url 下载下来
127
+
128
+ TODO 增加 md5校验、自动解压 等功能
129
+
130
+ :param if_exists: 参数含义见 file.exist_preprcs
131
+ 使用 'replace' 可以强制下载重置文件
132
+ :param progress: 是否显示下载进度
133
+
134
+ >> ensure_localfile('ufo.csv', r'https://gitee.com/code4101/TestData/raw/master/ufo.csv')
135
+ """
136
+ path, file = str(localfile), File(localfile)
137
+
138
+ if file.exist_preprcs(if_exists):
139
+ dirname, name = os.path.split(path)
140
+ download(from_url, dirname, filename=name, progress=progress)
141
+ return localfile
142
+
143
+
144
+ def ensure_localdir(localdir, from_url, *, if_exists=None, progress=True, wrap=0):
145
+ """ 判断本地目录 localdir 是否存在,如果不存在,自动从指定的 from_url 下载下来
146
+
147
+ :param from_url: 相比 ensure_localfile,这个链接一般是一个压缩包,下载到本地后要解压到目标目录
148
+ :param wrap:
149
+ wrap=1,如果压缩包里的文件有多个,可以多加一层目录包装起来
150
+ wrap<0,有的从url下载的压缩包,还会自带一层目录,为了避免冗余,要去掉
151
+ """
152
+ from pyxllib.file.packlib import unpack_archive
153
+ d = Dir(localdir)
154
+ if not d.is_dir():
155
+ if d.exist_preprcs(if_exists):
156
+ pack_file = download(from_url, d.parent, progress=progress)
157
+ unpack_archive(pack_file, localdir, wrap=wrap)
158
+ os.remove(pack_file)
159
+
160
+ return localdir
161
+
162
+
163
+ def get_font_file(name):
164
+ """ 获得指定名称的字体文件
165
+
166
+ :param name: 记得要写后缀,例如 "simfang.ttf"
167
+ simfang.ttf,仿宋
168
+ msyh.ttf,微软雅黑
169
+ """
170
+ from pyxllib.file.specialist import ensure_localfile, XlPath
171
+
172
+ # 0 当前目录有,则优先返回当前目录的文件
173
+ p = XlPath(name)
174
+ if p.is_file():
175
+ return p
176
+
177
+ # 1 windows直接找系统的字体目录
178
+ font_file = XlPath(f'C:/Windows/Fonts/{name}')
179
+ if font_file.is_file():
180
+ return font_file
181
+
182
+ # 2 否则下载到.xlpr/fonts
183
+ # 注意不能下载到C:/Windows/Fonts,会遇到权限问题,报错
184
+ font_file = XlPath.userdir() / f'.xlpr/fonts/{name}'
185
+ # 去github上paddleocr项目下载
186
+ # from_url = f'https://raw.githubusercontent.com/code4101/data1/main/fonts/{name}'
187
+ from_url = f'https://xmutpriu.com/download/fonts/{name}'
188
+ try:
189
+ ensure_localfile(font_file, from_url)
190
+ except TimeoutError as e:
191
+ raise TimeoutError(f'{font_file} 下载失败:{from_url}')
192
+
193
+ return font_file