pyxllib 0.3.197__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.
Files changed (127) hide show
  1. pyxllib/__init__.py +14 -21
  2. pyxllib/algo/__init__.py +8 -8
  3. pyxllib/algo/disjoint.py +54 -54
  4. pyxllib/algo/geo.py +537 -541
  5. pyxllib/algo/intervals.py +964 -964
  6. pyxllib/algo/matcher.py +389 -389
  7. pyxllib/algo/newbie.py +166 -166
  8. pyxllib/algo/pupil.py +629 -629
  9. pyxllib/algo/shapelylib.py +67 -67
  10. pyxllib/algo/specialist.py +241 -241
  11. pyxllib/algo/stat.py +494 -494
  12. pyxllib/algo/treelib.py +145 -149
  13. pyxllib/algo/unitlib.py +62 -66
  14. pyxllib/autogui/__init__.py +5 -5
  15. pyxllib/autogui/activewin.py +246 -246
  16. pyxllib/autogui/all.py +9 -9
  17. pyxllib/autogui/autogui.py +846 -852
  18. pyxllib/autogui/uiautolib.py +362 -362
  19. pyxllib/autogui/virtualkey.py +102 -102
  20. pyxllib/autogui/wechat.py +827 -827
  21. pyxllib/autogui/wechat_msg.py +421 -421
  22. pyxllib/autogui/wxautolib.py +84 -84
  23. pyxllib/cv/__init__.py +5 -5
  24. pyxllib/cv/expert.py +267 -267
  25. pyxllib/cv/imfile.py +159 -159
  26. pyxllib/cv/imhash.py +39 -39
  27. pyxllib/cv/pupil.py +9 -9
  28. pyxllib/cv/rgbfmt.py +1525 -1525
  29. pyxllib/cv/slidercaptcha.py +137 -137
  30. pyxllib/cv/trackbartools.py +251 -251
  31. pyxllib/cv/xlcvlib.py +1040 -1040
  32. pyxllib/cv/xlpillib.py +423 -423
  33. pyxllib/data/echarts.py +236 -240
  34. pyxllib/data/jsonlib.py +85 -89
  35. pyxllib/data/oss.py +72 -72
  36. pyxllib/data/pglib.py +1111 -1127
  37. pyxllib/data/sqlite.py +568 -568
  38. pyxllib/data/sqllib.py +297 -297
  39. pyxllib/ext/JLineViewer.py +505 -505
  40. pyxllib/ext/__init__.py +6 -6
  41. pyxllib/ext/demolib.py +251 -246
  42. pyxllib/ext/drissionlib.py +277 -277
  43. pyxllib/ext/kq5034lib.py +12 -12
  44. pyxllib/ext/qt.py +449 -449
  45. pyxllib/ext/robustprocfile.py +493 -497
  46. pyxllib/ext/seleniumlib.py +76 -76
  47. pyxllib/ext/tk.py +173 -173
  48. pyxllib/ext/unixlib.py +821 -827
  49. pyxllib/ext/utools.py +345 -351
  50. pyxllib/ext/webhook.py +124 -119
  51. pyxllib/ext/win32lib.py +40 -40
  52. pyxllib/ext/wjxlib.py +91 -88
  53. pyxllib/ext/wpsapi.py +124 -124
  54. pyxllib/ext/xlwork.py +9 -9
  55. pyxllib/ext/yuquelib.py +1110 -1105
  56. pyxllib/file/__init__.py +17 -17
  57. pyxllib/file/docxlib.py +757 -761
  58. pyxllib/file/gitlib.py +309 -309
  59. pyxllib/file/libreoffice.py +165 -165
  60. pyxllib/file/movielib.py +144 -148
  61. pyxllib/file/newbie.py +10 -10
  62. pyxllib/file/onenotelib.py +1469 -1469
  63. pyxllib/file/packlib/__init__.py +330 -330
  64. pyxllib/file/packlib/zipfile.py +2441 -2441
  65. pyxllib/file/pdflib.py +422 -426
  66. pyxllib/file/pupil.py +185 -185
  67. pyxllib/file/specialist/__init__.py +681 -685
  68. pyxllib/file/specialist/dirlib.py +799 -799
  69. pyxllib/file/specialist/download.py +193 -193
  70. pyxllib/file/specialist/filelib.py +2825 -2829
  71. pyxllib/file/xlsxlib.py +3122 -3131
  72. pyxllib/file/xlsyncfile.py +341 -341
  73. pyxllib/prog/__init__.py +5 -5
  74. pyxllib/prog/cachetools.py +58 -64
  75. pyxllib/prog/deprecatedlib.py +233 -233
  76. pyxllib/prog/filelock.py +42 -42
  77. pyxllib/prog/ipyexec.py +253 -253
  78. pyxllib/prog/multiprogs.py +940 -940
  79. pyxllib/prog/newbie.py +451 -451
  80. pyxllib/prog/pupil.py +1208 -1197
  81. pyxllib/prog/sitepackages.py +33 -33
  82. pyxllib/prog/specialist/__init__.py +348 -391
  83. pyxllib/prog/specialist/bc.py +203 -203
  84. pyxllib/prog/specialist/browser.py +497 -497
  85. pyxllib/prog/specialist/common.py +347 -347
  86. pyxllib/prog/specialist/datetime.py +198 -198
  87. pyxllib/prog/specialist/tictoc.py +240 -240
  88. pyxllib/prog/specialist/xllog.py +180 -180
  89. pyxllib/prog/xlosenv.py +110 -108
  90. pyxllib/stdlib/__init__.py +17 -17
  91. pyxllib/stdlib/tablepyxl/__init__.py +10 -10
  92. pyxllib/stdlib/tablepyxl/style.py +303 -303
  93. pyxllib/stdlib/tablepyxl/tablepyxl.py +130 -130
  94. pyxllib/text/__init__.py +8 -8
  95. pyxllib/text/ahocorasick.py +36 -39
  96. pyxllib/text/airscript.js +754 -744
  97. pyxllib/text/charclasslib.py +121 -121
  98. pyxllib/text/jiebalib.py +267 -267
  99. pyxllib/text/jinjalib.py +27 -32
  100. pyxllib/text/jsa_ai_prompt.md +271 -271
  101. pyxllib/text/jscode.py +922 -922
  102. pyxllib/text/latex/__init__.py +158 -158
  103. pyxllib/text/levenshtein.py +303 -303
  104. pyxllib/text/nestenv.py +1215 -1215
  105. pyxllib/text/newbie.py +300 -300
  106. pyxllib/text/pupil/__init__.py +8 -8
  107. pyxllib/text/pupil/common.py +1121 -1121
  108. pyxllib/text/pupil/xlalign.py +326 -326
  109. pyxllib/text/pycode.py +47 -47
  110. pyxllib/text/specialist/__init__.py +8 -8
  111. pyxllib/text/specialist/common.py +112 -112
  112. pyxllib/text/specialist/ptag.py +186 -186
  113. pyxllib/text/spellchecker.py +172 -172
  114. pyxllib/text/templates/echart_base.html +10 -10
  115. pyxllib/text/templates/highlight_code.html +16 -16
  116. pyxllib/text/templates/latex_editor.html +102 -102
  117. pyxllib/text/vbacode.py +17 -17
  118. pyxllib/text/xmllib.py +741 -747
  119. pyxllib/xl.py +42 -39
  120. pyxllib/xlcv.py +17 -17
  121. pyxllib-3.201.1.dist-info/METADATA +296 -0
  122. pyxllib-3.201.1.dist-info/RECORD +125 -0
  123. {pyxllib-0.3.197.dist-info → pyxllib-3.201.1.dist-info}/licenses/LICENSE +190 -190
  124. pyxllib/ext/old.py +0 -663
  125. pyxllib-0.3.197.dist-info/METADATA +0 -48
  126. pyxllib-0.3.197.dist-info/RECORD +0 -126
  127. {pyxllib-0.3.197.dist-info → pyxllib-3.201.1.dist-info}/WHEEL +0 -0
@@ -1,199 +1,199 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2021/06/03 23:28
6
-
7
- """
8
-
9
- 旧的Datetime类已删除,原来稍微比较有用的一个功能,是
10
-
11
- 替换周几,这个算法可以参考:
12
- a = a - a.isoweekday() + kwargs['weekday'] # 先减去当前星期几,再加上1~7的一个目标星期
13
-
14
- """
15
-
16
- import datetime
17
- import re
18
-
19
- from fastcore.utils import GetAttr
20
-
21
-
22
- def parse_datetime(*argv):
23
- """ 解析字符串日期时间
24
-
25
- 解析算法偏私人应用,规则虽然多,但反而变得混乱隐晦,
26
- 实际开发能明确使用具体接口,尽量还是用具体接口。
27
-
28
- # 建议使用 Datetime.strptime
29
- >>> parse_datetime('2019年3月6日', '%Y年%m月%d日') # 指定格式
30
- datetime.datetime(2019, 3, 6, 0, 0)
31
- >>> parse_datetime('w200301周日', 'w%y%m%d周日') # 周日必须写全,有缺失会报ValueError
32
- datetime.datetime(2020, 3, 1, 0, 0)
33
-
34
- >>> parse_datetime('2019.3.6 22:30:40')
35
- datetime.datetime(2019, 3, 6, 22, 30, 40)
36
-
37
- >>> parse_datetime(180213)
38
- datetime.datetime(2018, 2, 13, 0, 0)
39
- >>> parse_datetime('180213')
40
- datetime.datetime(2018, 2, 13, 0, 0)
41
-
42
- # 以下只对2000~2099年的时间点有效
43
- >>> parse_datetime('2015-06-15_22-19-01_HDR.jpg')
44
- datetime.datetime(2015, 6, 15, 22, 19, 1)
45
- >>> parse_datetime('IMG_20150615_2219011234_HDR.jpg')
46
- datetime.datetime(2015, 6, 15, 22, 19, 1, 1234)
47
- >>> parse_datetime('_2015.6.15_22:19:02')
48
- datetime.datetime(2015, 6, 15, 22, 19, 2)
49
- """
50
-
51
- def _datetime(argv):
52
- args, n = list(argv), len(argv)
53
- if n < 3: # 若没填写月、日,默认1月、1日
54
- args = args + [1] * (3 - n)
55
- try:
56
- return datetime.datetime(*args)
57
- except (ValueError, TypeError) as e:
58
- return None
59
-
60
- def _six_digits_date(s):
61
- """主要是我个人常用的日期标注格式
62
- """
63
- s, dt = str(s), None
64
- if re.match(r'\d{6}$', s):
65
- year = int(s[:2])
66
- year = 2000 + year if year < 50 else 1900 + year # 小于50默认是20xx年,否则认为是19xx年
67
- dt = _datetime([year, int(s[2:4]), int(s[4:])])
68
- return dt
69
-
70
- def _parse_time_string(s):
71
- r"""只对2000~2099年的时间点有效
72
- """
73
- data, break_flag = [], False
74
-
75
- def parse(pattern, left=None, right=None):
76
- """通用底层解析器"""
77
- nonlocal break_flag, s
78
- if break_flag: return
79
-
80
- m = re.search(pattern, s)
81
- if m:
82
- d = int(m.group())
83
- if left and d < left:
84
- break_flag = True
85
- elif right and d > right:
86
- break_flag = True
87
- else:
88
- data.append(d)
89
- s = s[m.end():]
90
- else:
91
- break_flag = True
92
-
93
- parse(r'20\d{2}')
94
- parse(r'\d\d?', 1, 12) # 有连续两个数组就获得两个,否则获得一个也行
95
- parse(r'\d\d?', 1, 31) # 这样其实不严谨,有的月份不到31天,不过反正_datetime会返回None代表处理失败的
96
- parse(r'\d\d?', 0, 23)
97
- parse(r'\d\d?', 0, 59)
98
- parse(r'\d\d?', 0, 59)
99
- parse(r'\d{1,6}') # microsecond
100
-
101
- return _datetime(data)
102
-
103
- dt = None
104
- # 1 没有参数则默认当前运行时间
105
- if not argv:
106
- dt = datetime.datetime.now()
107
- if not dt and isinstance(argv[0], datetime.datetime):
108
- dt = argv[0]
109
- if not dt and isinstance(argv[0], datetime.date):
110
- # 要转成datetime类型,time部分默认00:00:00
111
- dt = datetime.datetime.combine(argv[0], datetime.time())
112
- if not dt and isinstance(argv[0], float):
113
- dt = datetime.datetime.fromtimestamp(argv[0])
114
- # 2 如果上述解析不了,且argv恰好为两个参数,则判断为使用strptime初始化
115
- if not dt and len(argv) == 2:
116
- dt = datetime.datetime.strptime(str(argv[0]), argv[1])
117
- # 3 判断是否我个人特用的六位日期标记
118
- if not dt:
119
- dt = _six_digits_date(argv[0])
120
- # 4 如果仍然解析不了,开始使用一个智能推导算法
121
- if not dt:
122
- dt = _parse_time_string(argv[0])
123
- # 5 最后任何解析方案都失败,则返回None
124
-
125
- return dt
126
-
127
-
128
- def parse_timedelta(s):
129
- """ 解析字符串所代表的时间差
130
-
131
- >>> parse_timedelta('38:18')
132
- datetime.timedelta(seconds=2298)
133
- >>> parse_timedelta('03:55')
134
- datetime.timedelta(seconds=235)
135
- >>> parse_timedelta('1:34:25')
136
- datetime.timedelta(seconds=5665)
137
- """
138
- parts = s.split(':')[::-1]
139
- d = {k: int(v) for k, v in zip(['seconds', 'minutes', 'hours'], parts)}
140
- td = datetime.timedelta(**d)
141
- return td
142
-
143
-
144
- class XlWeekTag(GetAttr):
145
- """ 个人周标签转换工具 """
146
- _default = 'dt'
147
-
148
- def __init__(self, dt=None):
149
- """
150
- :param datetime|其他类日期表达 dt: 可以输入一个日期,默认为今天
151
- """
152
- if dt is None:
153
- dt = datetime.date.today()
154
- self.dt = parse_datetime(dt)
155
-
156
- def __1_日期移动(self):
157
- pass
158
-
159
- def add_days(self, days):
160
- """ 增加指定天数,支持负数 """
161
- return self.__class__(self.dt + datetime.timedelta(days=days))
162
-
163
- def monday(self):
164
- """ 移动到本周周一 """
165
- return self.add_days(-self.dt.weekday())
166
-
167
- def next_week(self):
168
- """ 移动到下一周 """
169
- return self.add_days(7)
170
-
171
- def prev_week(self):
172
- """ 移动到上一周 """
173
- return self.add_days(-7)
174
-
175
- def __2_生成标签(self):
176
- pass
177
-
178
- def weektag(self):
179
- """
180
- :return: 周标签名,例如 'w250414',表示所属周的周一是2025年4月14日
181
- """
182
- monday = self.monday() # 获取本周周一
183
- tag = 'w' + monday.strftime('%y%m%d')
184
- return tag
185
-
186
- def daytag(self):
187
- """
188
- :return: 日标签名,例如 '250415周二',表示当天的日期标记,一般是语雀周报中使用
189
- """
190
- ch = '一二三四五六日'[self.dt.weekday()]
191
- tag = self.dt.strftime('%y%m%d') + '周' + ch
192
- return tag
193
-
194
- def week_daytags(self):
195
- # 循环获得本周每天的daytag
196
- monday = self.monday()
197
- tags = [monday.add_days(i).daytag() for i in range(7)]
198
- return tags
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2021/06/03 23:28
6
+
7
+ """
8
+
9
+ 旧的Datetime类已删除,原来稍微比较有用的一个功能,是
10
+
11
+ 替换周几,这个算法可以参考:
12
+ a = a - a.isoweekday() + kwargs['weekday'] # 先减去当前星期几,再加上1~7的一个目标星期
13
+
14
+ """
15
+
16
+ import datetime
17
+ import re
18
+
19
+ from fastcore.utils import GetAttr
20
+
21
+
22
+ def parse_datetime(*argv):
23
+ """ 解析字符串日期时间
24
+
25
+ 解析算法偏私人应用,规则虽然多,但反而变得混乱隐晦,
26
+ 实际开发能明确使用具体接口,尽量还是用具体接口。
27
+
28
+ # 建议使用 Datetime.strptime
29
+ >>> parse_datetime('2019年3月6日', '%Y年%m月%d日') # 指定格式
30
+ datetime.datetime(2019, 3, 6, 0, 0)
31
+ >>> parse_datetime('w200301周日', 'w%y%m%d周日') # 周日必须写全,有缺失会报ValueError
32
+ datetime.datetime(2020, 3, 1, 0, 0)
33
+
34
+ >>> parse_datetime('2019.3.6 22:30:40')
35
+ datetime.datetime(2019, 3, 6, 22, 30, 40)
36
+
37
+ >>> parse_datetime(180213)
38
+ datetime.datetime(2018, 2, 13, 0, 0)
39
+ >>> parse_datetime('180213')
40
+ datetime.datetime(2018, 2, 13, 0, 0)
41
+
42
+ # 以下只对2000~2099年的时间点有效
43
+ >>> parse_datetime('2015-06-15_22-19-01_HDR.jpg')
44
+ datetime.datetime(2015, 6, 15, 22, 19, 1)
45
+ >>> parse_datetime('IMG_20150615_2219011234_HDR.jpg')
46
+ datetime.datetime(2015, 6, 15, 22, 19, 1, 1234)
47
+ >>> parse_datetime('_2015.6.15_22:19:02')
48
+ datetime.datetime(2015, 6, 15, 22, 19, 2)
49
+ """
50
+
51
+ def _datetime(argv):
52
+ args, n = list(argv), len(argv)
53
+ if n < 3: # 若没填写月、日,默认1月、1日
54
+ args = args + [1] * (3 - n)
55
+ try:
56
+ return datetime.datetime(*args)
57
+ except (ValueError, TypeError) as e:
58
+ return None
59
+
60
+ def _six_digits_date(s):
61
+ """主要是我个人常用的日期标注格式
62
+ """
63
+ s, dt = str(s), None
64
+ if re.match(r'\d{6}$', s):
65
+ year = int(s[:2])
66
+ year = 2000 + year if year < 50 else 1900 + year # 小于50默认是20xx年,否则认为是19xx年
67
+ dt = _datetime([year, int(s[2:4]), int(s[4:])])
68
+ return dt
69
+
70
+ def _parse_time_string(s):
71
+ r"""只对2000~2099年的时间点有效
72
+ """
73
+ data, break_flag = [], False
74
+
75
+ def parse(pattern, left=None, right=None):
76
+ """通用底层解析器"""
77
+ nonlocal break_flag, s
78
+ if break_flag: return
79
+
80
+ m = re.search(pattern, s)
81
+ if m:
82
+ d = int(m.group())
83
+ if left and d < left:
84
+ break_flag = True
85
+ elif right and d > right:
86
+ break_flag = True
87
+ else:
88
+ data.append(d)
89
+ s = s[m.end():]
90
+ else:
91
+ break_flag = True
92
+
93
+ parse(r'20\d{2}')
94
+ parse(r'\d\d?', 1, 12) # 有连续两个数组就获得两个,否则获得一个也行
95
+ parse(r'\d\d?', 1, 31) # 这样其实不严谨,有的月份不到31天,不过反正_datetime会返回None代表处理失败的
96
+ parse(r'\d\d?', 0, 23)
97
+ parse(r'\d\d?', 0, 59)
98
+ parse(r'\d\d?', 0, 59)
99
+ parse(r'\d{1,6}') # microsecond
100
+
101
+ return _datetime(data)
102
+
103
+ dt = None
104
+ # 1 没有参数则默认当前运行时间
105
+ if not argv:
106
+ dt = datetime.datetime.now()
107
+ if not dt and isinstance(argv[0], datetime.datetime):
108
+ dt = argv[0]
109
+ if not dt and isinstance(argv[0], datetime.date):
110
+ # 要转成datetime类型,time部分默认00:00:00
111
+ dt = datetime.datetime.combine(argv[0], datetime.time())
112
+ if not dt and isinstance(argv[0], float):
113
+ dt = datetime.datetime.fromtimestamp(argv[0])
114
+ # 2 如果上述解析不了,且argv恰好为两个参数,则判断为使用strptime初始化
115
+ if not dt and len(argv) == 2:
116
+ dt = datetime.datetime.strptime(str(argv[0]), argv[1])
117
+ # 3 判断是否我个人特用的六位日期标记
118
+ if not dt:
119
+ dt = _six_digits_date(argv[0])
120
+ # 4 如果仍然解析不了,开始使用一个智能推导算法
121
+ if not dt:
122
+ dt = _parse_time_string(argv[0])
123
+ # 5 最后任何解析方案都失败,则返回None
124
+
125
+ return dt
126
+
127
+
128
+ def parse_timedelta(s):
129
+ """ 解析字符串所代表的时间差
130
+
131
+ >>> parse_timedelta('38:18')
132
+ datetime.timedelta(seconds=2298)
133
+ >>> parse_timedelta('03:55')
134
+ datetime.timedelta(seconds=235)
135
+ >>> parse_timedelta('1:34:25')
136
+ datetime.timedelta(seconds=5665)
137
+ """
138
+ parts = s.split(':')[::-1]
139
+ d = {k: int(v) for k, v in zip(['seconds', 'minutes', 'hours'], parts)}
140
+ td = datetime.timedelta(**d)
141
+ return td
142
+
143
+
144
+ class XlWeekTag(GetAttr):
145
+ """ 个人周标签转换工具 """
146
+ _default = 'dt'
147
+
148
+ def __init__(self, dt=None):
149
+ """
150
+ :param datetime|其他类日期表达 dt: 可以输入一个日期,默认为今天
151
+ """
152
+ if dt is None:
153
+ dt = datetime.date.today()
154
+ self.dt = parse_datetime(dt)
155
+
156
+ def __1_日期移动(self):
157
+ pass
158
+
159
+ def add_days(self, days):
160
+ """ 增加指定天数,支持负数 """
161
+ return self.__class__(self.dt + datetime.timedelta(days=days))
162
+
163
+ def monday(self):
164
+ """ 移动到本周周一 """
165
+ return self.add_days(-self.dt.weekday())
166
+
167
+ def next_week(self):
168
+ """ 移动到下一周 """
169
+ return self.add_days(7)
170
+
171
+ def prev_week(self):
172
+ """ 移动到上一周 """
173
+ return self.add_days(-7)
174
+
175
+ def __2_生成标签(self):
176
+ pass
177
+
178
+ def weektag(self):
179
+ """
180
+ :return: 周标签名,例如 'w250414',表示所属周的周一是2025年4月14日
181
+ """
182
+ monday = self.monday() # 获取本周周一
183
+ tag = 'w' + monday.strftime('%y%m%d')
184
+ return tag
185
+
186
+ def daytag(self):
187
+ """
188
+ :return: 日标签名,例如 '250415周二',表示当天的日期标记,一般是语雀周报中使用
189
+ """
190
+ ch = '一二三四五六日'[self.dt.weekday()]
191
+ tag = self.dt.strftime('%y%m%d') + '周' + ch
192
+ return tag
193
+
194
+ def week_daytags(self):
195
+ # 循环获得本周每天的daytag
196
+ monday = self.monday()
197
+ tags = [monday.add_days(i).daytag() for i in range(7)]
198
+ return tags
199
199