re-common 10.0.39__py3-none-any.whl → 10.0.40__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.
- re_common/baselibrary/__init__.py +4 -4
- re_common/baselibrary/baseabs/__init__.py +6 -6
- re_common/baselibrary/baseabs/baseabs.py +26 -26
- re_common/baselibrary/database/mbuilder.py +132 -132
- re_common/baselibrary/database/moudle.py +93 -93
- re_common/baselibrary/database/msqlite3.py +194 -194
- re_common/baselibrary/database/mysql.py +169 -169
- re_common/baselibrary/database/sql_factory.py +26 -26
- re_common/baselibrary/mthread/MThreadingRun.py +486 -486
- re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
- re_common/baselibrary/mthread/__init__.py +2 -2
- re_common/baselibrary/mthread/mythreading.py +695 -695
- re_common/baselibrary/pakge_other/socks.py +404 -404
- re_common/baselibrary/readconfig/config_factory.py +18 -18
- re_common/baselibrary/readconfig/ini_config.py +317 -317
- re_common/baselibrary/readconfig/toml_config.py +49 -49
- re_common/baselibrary/temporary/envdata.py +36 -36
- re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
- re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
- re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
- re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
- re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
- re_common/baselibrary/tools/contrast_db3.py +123 -123
- re_common/baselibrary/tools/copy_file.py +39 -39
- re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
- re_common/baselibrary/tools/foreachgz.py +39 -39
- re_common/baselibrary/tools/get_attr.py +10 -10
- re_common/baselibrary/tools/image_to_pdf.py +61 -61
- re_common/baselibrary/tools/java_code_deal.py +139 -139
- re_common/baselibrary/tools/javacode.py +79 -79
- re_common/baselibrary/tools/mdb_db3.py +48 -48
- re_common/baselibrary/tools/merge_file.py +171 -171
- re_common/baselibrary/tools/merge_gz_file.py +165 -165
- re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
- re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
- re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
- re_common/baselibrary/tools/mongo_tools.py +50 -50
- re_common/baselibrary/tools/move_file.py +170 -170
- re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
- re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
- re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
- re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
- re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
- re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
- re_common/baselibrary/tools/myparsel.py +104 -104
- re_common/baselibrary/tools/rename_dir_file.py +37 -37
- re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
- re_common/baselibrary/tools/split_line_to_many.py +25 -25
- re_common/baselibrary/tools/stringtodicts.py +33 -33
- re_common/baselibrary/tools/workwechant_bot.py +84 -84
- re_common/baselibrary/utils/baseaiohttp.py +296 -296
- re_common/baselibrary/utils/baseaiomysql.py +87 -87
- re_common/baselibrary/utils/baseallstep.py +191 -191
- re_common/baselibrary/utils/baseavro.py +19 -19
- re_common/baselibrary/utils/baseboto3.py +291 -291
- re_common/baselibrary/utils/basecsv.py +32 -32
- re_common/baselibrary/utils/basedict.py +133 -133
- re_common/baselibrary/utils/basedir.py +241 -241
- re_common/baselibrary/utils/baseencode.py +351 -351
- re_common/baselibrary/utils/baseencoding.py +28 -28
- re_common/baselibrary/utils/baseesdsl.py +86 -86
- re_common/baselibrary/utils/baseexcel.py +264 -264
- re_common/baselibrary/utils/baseexcept.py +109 -109
- re_common/baselibrary/utils/basefile.py +654 -654
- re_common/baselibrary/utils/baseftp.py +214 -214
- re_common/baselibrary/utils/basegzip.py +60 -60
- re_common/baselibrary/utils/basehdfs.py +135 -135
- re_common/baselibrary/utils/basehttpx.py +268 -268
- re_common/baselibrary/utils/baseip.py +87 -87
- re_common/baselibrary/utils/basejson.py +2 -2
- re_common/baselibrary/utils/baselist.py +32 -32
- re_common/baselibrary/utils/basemotor.py +190 -190
- re_common/baselibrary/utils/basemssql.py +98 -98
- re_common/baselibrary/utils/baseodbc.py +113 -113
- re_common/baselibrary/utils/basepandas.py +302 -302
- re_common/baselibrary/utils/basepeewee.py +11 -11
- re_common/baselibrary/utils/basepika.py +180 -180
- re_common/baselibrary/utils/basepydash.py +143 -143
- re_common/baselibrary/utils/basepymongo.py +230 -230
- re_common/baselibrary/utils/basequeue.py +22 -22
- re_common/baselibrary/utils/baserar.py +57 -57
- re_common/baselibrary/utils/baserequest.py +279 -279
- re_common/baselibrary/utils/baseset.py +8 -8
- re_common/baselibrary/utils/basesmb.py +403 -403
- re_common/baselibrary/utils/basestring.py +382 -382
- re_common/baselibrary/utils/basetime.py +320 -320
- re_common/baselibrary/utils/baseurl.py +121 -121
- re_common/baselibrary/utils/basezip.py +57 -57
- re_common/baselibrary/utils/core/__init__.py +7 -7
- re_common/baselibrary/utils/core/bottomutils.py +18 -18
- re_common/baselibrary/utils/core/mdeprecated.py +327 -327
- re_common/baselibrary/utils/core/mlamada.py +16 -16
- re_common/baselibrary/utils/core/msginfo.py +25 -25
- re_common/baselibrary/utils/core/requests_core.py +103 -103
- re_common/baselibrary/utils/fateadm.py +429 -429
- re_common/baselibrary/utils/importfun.py +123 -123
- re_common/baselibrary/utils/mfaker.py +57 -57
- re_common/baselibrary/utils/my_abc/__init__.py +3 -3
- re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
- re_common/baselibrary/utils/mylogger.py +414 -414
- re_common/baselibrary/utils/myredisclient.py +861 -861
- re_common/baselibrary/utils/pipupgrade.py +21 -21
- re_common/baselibrary/utils/ringlist.py +85 -85
- re_common/baselibrary/utils/version_compare.py +36 -36
- re_common/baselibrary/utils/ydmhttp.py +126 -126
- re_common/facade/lazy_import.py +11 -11
- re_common/facade/loggerfacade.py +25 -25
- re_common/facade/mysqlfacade.py +467 -467
- re_common/facade/now.py +31 -31
- re_common/facade/sqlite3facade.py +257 -257
- re_common/facade/use/mq_use_facade.py +83 -83
- re_common/facade/use/proxy_use_facade.py +19 -19
- re_common/libtest/base_dict_test.py +19 -19
- re_common/libtest/baseavro_test.py +13 -13
- re_common/libtest/basefile_test.py +14 -14
- re_common/libtest/basemssql_test.py +77 -77
- re_common/libtest/baseodbc_test.py +7 -7
- re_common/libtest/basepandas_test.py +38 -38
- re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
- re_common/libtest/get_attr_test/settings.py +54 -54
- re_common/libtest/idencode_test.py +53 -53
- re_common/libtest/iniconfig_test.py +35 -35
- re_common/libtest/ip_test.py +34 -34
- re_common/libtest/merge_file_test.py +20 -20
- re_common/libtest/mfaker_test.py +8 -8
- re_common/libtest/mm3_test.py +31 -31
- re_common/libtest/mylogger_test.py +88 -88
- re_common/libtest/myparsel_test.py +27 -27
- re_common/libtest/mysql_test.py +151 -151
- re_common/libtest/pymongo_test.py +21 -21
- re_common/libtest/split_test.py +11 -11
- re_common/libtest/sqlite3_merge_test.py +5 -5
- re_common/libtest/sqlite3_test.py +34 -34
- re_common/libtest/tomlconfig_test.py +30 -30
- re_common/libtest/use_tools_test/__init__.py +2 -2
- re_common/libtest/user/__init__.py +4 -4
- re_common/studio/__init__.py +4 -4
- re_common/studio/assignment_expressions.py +36 -36
- re_common/studio/mydash/test1.py +18 -18
- re_common/studio/pydashstudio/first.py +9 -9
- re_common/studio/streamlitstudio/first_app.py +65 -65
- re_common/studio/streamlitstudio/uber_pickups.py +23 -23
- re_common/studio/test.py +18 -18
- re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +219 -219
- re_common/v2/baselibrary/business_utils/baseencodeid.py +100 -100
- re_common/v2/baselibrary/business_utils/full_doi_path.py +116 -116
- re_common/v2/baselibrary/business_utils/rel_tools.py +6 -6
- re_common/v2/baselibrary/decorators/utils.py +59 -59
- re_common/v2/baselibrary/helpers/search_packge/NearestNeighbors_test.py +105 -105
- re_common/v2/baselibrary/helpers/search_packge/fit_text_match.py +253 -253
- re_common/v2/baselibrary/helpers/search_packge/scikit_learn_text_matcher.py +260 -260
- re_common/v2/baselibrary/helpers/search_packge/test.py +1 -1
- re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
- re_common/v2/baselibrary/tools/WeChatRobot.py +95 -95
- re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
- re_common/v2/baselibrary/tools/concurrency.py +35 -35
- re_common/v2/baselibrary/tools/data_processer/base.py +53 -53
- re_common/v2/baselibrary/tools/data_processer/data_processer.py +508 -508
- re_common/v2/baselibrary/tools/data_processer/data_reader.py +187 -187
- re_common/v2/baselibrary/tools/data_processer/data_writer.py +38 -38
- re_common/v2/baselibrary/tools/dict_tools.py +44 -44
- re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
- re_common/v2/baselibrary/tools/hdfs_base_processor.py +204 -204
- re_common/v2/baselibrary/tools/hdfs_bulk_processor.py +67 -67
- re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
- re_common/v2/baselibrary/tools/hdfs_line_processor.py +74 -74
- re_common/v2/baselibrary/tools/list_tools.py +69 -69
- re_common/v2/baselibrary/tools/resume_tracker.py +94 -94
- re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
- re_common/v2/baselibrary/tools/text_matcher.py +326 -326
- re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
- re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
- re_common/v2/baselibrary/utils/api_net_utils.py +270 -270
- re_common/v2/baselibrary/utils/author_smi.py +361 -361
- re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
- re_common/v2/baselibrary/utils/basedict.py +37 -37
- re_common/v2/baselibrary/utils/basehdfs.py +163 -163
- re_common/v2/baselibrary/utils/basepika.py +180 -180
- re_common/v2/baselibrary/utils/basetime.py +77 -77
- re_common/v2/baselibrary/utils/db.py +156 -156
- re_common/v2/baselibrary/utils/elasticsearch.py +46 -0
- re_common/v2/baselibrary/utils/json_cls.py +16 -16
- re_common/v2/baselibrary/utils/mq.py +83 -83
- re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
- re_common/v2/baselibrary/utils/string_bool.py +186 -186
- re_common/v2/baselibrary/utils/string_clear.py +246 -246
- re_common/v2/baselibrary/utils/string_smi.py +18 -18
- re_common/v2/baselibrary/utils/stringutils.py +271 -271
- re_common/vip/base_step_process.py +11 -11
- re_common/vip/baseencodeid.py +90 -90
- re_common/vip/changetaskname.py +28 -28
- re_common/vip/core_var.py +24 -24
- re_common/vip/mmh3Hash.py +89 -89
- re_common/vip/proxy/allproxys.py +127 -127
- re_common/vip/proxy/allproxys_thread.py +159 -159
- re_common/vip/proxy/cnki_proxy.py +153 -153
- re_common/vip/proxy/kuaidaili.py +87 -87
- re_common/vip/proxy/proxy_all.py +113 -113
- re_common/vip/proxy/update_kuaidaili_0.py +42 -42
- re_common/vip/proxy/wanfang_proxy.py +152 -152
- re_common/vip/proxy/wp_proxy_all.py +181 -181
- re_common/vip/read_rawid_to_txt.py +91 -91
- re_common/vip/title/__init__.py +5 -5
- re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
- re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
- re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
- re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
- re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
- re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
- re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
- re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
- re_common/vip/title/transform/__init__.py +10 -10
- {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/LICENSE +201 -201
- {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/METADATA +24 -16
- re_common-10.0.40.dist-info/RECORD +249 -0
- {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/WHEEL +1 -1
- re_common-10.0.39.dist-info/RECORD +0 -248
- {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/top_level.txt +0 -0
|
@@ -1,241 +1,241 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import shutil
|
|
3
|
-
import warnings
|
|
4
|
-
|
|
5
|
-
from re_common.baselibrary.utils.basefile import BaseFile
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class BaseDir(object):
|
|
9
|
-
|
|
10
|
-
@classmethod
|
|
11
|
-
def get_dir_all_files(cls, path):
|
|
12
|
-
"""
|
|
13
|
-
返回所有的文件 不会返回目录 目的是得到一个文件列表
|
|
14
|
-
# 这里注意topdown参数。
|
|
15
|
-
# topdown决定遍历的顺序,
|
|
16
|
-
# 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
|
|
17
|
-
# 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
|
|
18
|
-
# 我们需要先修改深层的子目录
|
|
19
|
-
:param path: 给定一个路径 如 C:/Users/XD/Pictures/所有视频/
|
|
20
|
-
:return:
|
|
21
|
-
"""
|
|
22
|
-
# 遍历子目录
|
|
23
|
-
assert cls.is_dir(path), NotADirectoryError(path + " not is a dir please check")
|
|
24
|
-
for path, dirNames, fileNames in os.walk(path, topdown=True):
|
|
25
|
-
# 获取当前目录的所有文件
|
|
26
|
-
for fileName in fileNames:
|
|
27
|
-
yield os.path.join(path, fileName)
|
|
28
|
-
|
|
29
|
-
@classmethod
|
|
30
|
-
def get_dir_all_dir(cls, s_path):
|
|
31
|
-
"""
|
|
32
|
-
获取目录下的最深子目录
|
|
33
|
-
# 这里注意topdown参数。
|
|
34
|
-
# topdown决定遍历的顺序,
|
|
35
|
-
# 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
|
|
36
|
-
# 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
|
|
37
|
-
# 我们需要先修改深层的子目录
|
|
38
|
-
:param path: 给定一个路径 如 C:/Users/XD/Pictures/所有视频/
|
|
39
|
-
:return:
|
|
40
|
-
"""
|
|
41
|
-
# 遍历子目录
|
|
42
|
-
assert cls.is_dir(s_path), NotADirectoryError(s_path + " not is a dir please check")
|
|
43
|
-
for path, dirNames, fileNames in os.walk(s_path, topdown=False):
|
|
44
|
-
# 获取当前目录的所有文件
|
|
45
|
-
for one_dir in dirNames:
|
|
46
|
-
f_path = os.path.join(path, one_dir)
|
|
47
|
-
for path1, dirNames1, fileNames1 in os.walk(f_path):
|
|
48
|
-
if len(dirNames1) == 0:
|
|
49
|
-
yield f_path
|
|
50
|
-
# break 原因是当一个目录有子目录时 会循环子目录,所以一次判断就可以了
|
|
51
|
-
break
|
|
52
|
-
|
|
53
|
-
@classmethod
|
|
54
|
-
def is_dir_exists(cls, pathdir):
|
|
55
|
-
"""
|
|
56
|
-
目录是否存在
|
|
57
|
-
:param sPth:
|
|
58
|
-
:return:
|
|
59
|
-
"""
|
|
60
|
-
return os.path.exists(pathdir)
|
|
61
|
-
|
|
62
|
-
@classmethod
|
|
63
|
-
def create_dir(cls, pathdir):
|
|
64
|
-
"""
|
|
65
|
-
创建目录 该方法可以创建多级目录
|
|
66
|
-
os.mkdir(pathdir)是创建一级目录 该目录的上级目录必须存在
|
|
67
|
-
:param pathdir:
|
|
68
|
-
:return:
|
|
69
|
-
"""
|
|
70
|
-
if not cls.is_dir_exists(pathdir):
|
|
71
|
-
os.makedirs(pathdir)
|
|
72
|
-
|
|
73
|
-
@classmethod
|
|
74
|
-
def get_upper_dir(cls, curPath: str, num: int) -> str:
|
|
75
|
-
"""
|
|
76
|
-
获取上几层的目录,如果包含文件名 -1 代表着这个文件的目录
|
|
77
|
-
:param curPath:
|
|
78
|
-
:param num:
|
|
79
|
-
:return:
|
|
80
|
-
"""
|
|
81
|
-
# 如果不是个整数
|
|
82
|
-
if not isinstance(num, int) or num > 0:
|
|
83
|
-
warnings.warn("this not int or num > 0 , The path is not processed, return curPath")
|
|
84
|
-
return curPath
|
|
85
|
-
pathlist = curPath.split(os.sep)
|
|
86
|
-
if abs(num) > (len(pathlist) - 1):
|
|
87
|
-
warnings.warn("this path length < num ,will return root dir ")
|
|
88
|
-
num = (len(pathlist) - 1) * (-1)
|
|
89
|
-
pathlist = pathlist[:num]
|
|
90
|
-
TopPath = os.sep.join(pathlist)
|
|
91
|
-
return TopPath
|
|
92
|
-
|
|
93
|
-
@classmethod
|
|
94
|
-
def get_file_dir_absolute(cls, file):
|
|
95
|
-
"""
|
|
96
|
-
请传入 __file__ 作为参数
|
|
97
|
-
获取一个文件的绝对路径
|
|
98
|
-
:param __file__:
|
|
99
|
-
:return:
|
|
100
|
-
"""
|
|
101
|
-
curPath = os.path.dirname(os.path.abspath(file))
|
|
102
|
-
return curPath
|
|
103
|
-
|
|
104
|
-
@classmethod
|
|
105
|
-
def is_dir(cls, spath):
|
|
106
|
-
if os.path.isdir(spath):
|
|
107
|
-
return True
|
|
108
|
-
return False
|
|
109
|
-
|
|
110
|
-
@classmethod
|
|
111
|
-
def get_dir_size(cls, dirpath):
|
|
112
|
-
"""
|
|
113
|
-
1eb = 1024pb
|
|
114
|
-
1pb = 1024tb
|
|
115
|
-
1tb = 1024gb
|
|
116
|
-
1gb = 1024mb
|
|
117
|
-
1mb = 1024kb
|
|
118
|
-
1kb = 1024b
|
|
119
|
-
上面的b是Byte
|
|
120
|
-
1Byte = 8bit
|
|
121
|
-
:param dirpath:
|
|
122
|
-
:return: 这里返回的是Byte大小
|
|
123
|
-
"""
|
|
124
|
-
size = 0
|
|
125
|
-
for filepath in cls.get_dir_all_files(dirpath):
|
|
126
|
-
size += sum(BaseFile.get_file_size(filepath))
|
|
127
|
-
return size
|
|
128
|
-
|
|
129
|
-
@classmethod
|
|
130
|
-
def copy_file_to_dir(cls, filePath, tarDirPath):
|
|
131
|
-
"""
|
|
132
|
-
|
|
133
|
-
:param filePath: 文件路径
|
|
134
|
-
:param tarDirPath: 目录或文件路径
|
|
135
|
-
:return:
|
|
136
|
-
"""
|
|
137
|
-
assert BaseFile.is_file_exists(filePath), FileNotFoundError("需要copy的文件不存在")
|
|
138
|
-
assert BaseFile.is_file(filePath), FileNotFoundError("需要copy的不是一个文件")
|
|
139
|
-
cls.create_dir(tarDirPath)
|
|
140
|
-
shutil.copy(filePath, tarDirPath)
|
|
141
|
-
|
|
142
|
-
@classmethod
|
|
143
|
-
def copy_dir_to_dir(cls, oldDir, newDir, moudle=0):
|
|
144
|
-
"""
|
|
145
|
-
olddir和newdir都只能是目录,且newdir必须不存在
|
|
146
|
-
:param oldDir:
|
|
147
|
-
:param newDir:
|
|
148
|
-
:return:
|
|
149
|
-
"""
|
|
150
|
-
assert cls.is_dir(oldDir), IsADirectoryError(oldDir + "目录不存在")
|
|
151
|
-
if moudle == 0:
|
|
152
|
-
# 该模式下新目录必须不存在
|
|
153
|
-
assert not cls.is_dir(newDir), IsADirectoryError(newDir + "目录存在,不能使用该模式,推荐使用模式2")
|
|
154
|
-
shutil.copytree(oldDir, newDir)
|
|
155
|
-
elif moudle == 1:
|
|
156
|
-
# 该模式下如果新目录存在先删除新目录
|
|
157
|
-
if cls.is_dir(newDir):
|
|
158
|
-
cls.delete_dir(newDir)
|
|
159
|
-
shutil.copytree(oldDir, newDir)
|
|
160
|
-
elif moudle == 3:
|
|
161
|
-
# 该模式下通过替换进行copy
|
|
162
|
-
pass
|
|
163
|
-
elif moudle == 4:
|
|
164
|
-
# 该模式会跳过已存在的文件 只将新文件放入其中
|
|
165
|
-
pass
|
|
166
|
-
|
|
167
|
-
@classmethod
|
|
168
|
-
def delete_dir(cls, dirpath):
|
|
169
|
-
"""
|
|
170
|
-
os.rmdir(dirpath) 只能删除空目录
|
|
171
|
-
os.removedirs(path) 递归的删除目录
|
|
172
|
-
:param dirpath:
|
|
173
|
-
:return:
|
|
174
|
-
"""
|
|
175
|
-
shutil.rmtree(dirpath)
|
|
176
|
-
|
|
177
|
-
@classmethod
|
|
178
|
-
def replace_dir_special_string(cls, strings):
|
|
179
|
-
"""
|
|
180
|
-
windows 目录非法字符
|
|
181
|
-
:param strings:
|
|
182
|
-
:return:
|
|
183
|
-
"""
|
|
184
|
-
strings1 = strings.replace("/", "").replace("\\", "") \
|
|
185
|
-
.replace(":", "").replace("*", "").replace("\"", "") \
|
|
186
|
-
.replace("<", "").replace(">", "").replace("|", "") \
|
|
187
|
-
.replace("?", "")
|
|
188
|
-
return strings1
|
|
189
|
-
|
|
190
|
-
@classmethod
|
|
191
|
-
def remove_file_suf(cls, dirpath, suf):
|
|
192
|
-
for file in cls.get_dir_all_files(dirpath):
|
|
193
|
-
if file.endswith(suf):
|
|
194
|
-
BaseFile.remove_file(file)
|
|
195
|
-
|
|
196
|
-
@classmethod
|
|
197
|
-
def is_null_dir(cls, dirpath):
|
|
198
|
-
"""
|
|
199
|
-
是否为空目录
|
|
200
|
-
:param dirpath:
|
|
201
|
-
:return:
|
|
202
|
-
"""
|
|
203
|
-
if not os.listdir(dirpath):
|
|
204
|
-
return True
|
|
205
|
-
return False
|
|
206
|
-
|
|
207
|
-
@classmethod
|
|
208
|
-
def get_dir_file_num(cls, dirpath):
|
|
209
|
-
return len([name for name in os.listdir(dirpath) if os.path.isfile(os.path.join(dirpath, name))])
|
|
210
|
-
|
|
211
|
-
@classmethod
|
|
212
|
-
def get_dir_all_file_num(cls, dirpath, ext=None):
|
|
213
|
-
"""
|
|
214
|
-
获取目录下所有文件个数,包含目录下目录的个数
|
|
215
|
-
:return:
|
|
216
|
-
"""
|
|
217
|
-
count = 0
|
|
218
|
-
for path in cls.get_dir_all_files(dirpath):
|
|
219
|
-
if BaseFile.is_file(path):
|
|
220
|
-
if ext is not None:
|
|
221
|
-
if path.endswith(ext):
|
|
222
|
-
count += 1
|
|
223
|
-
elif cls.is_dir(path):
|
|
224
|
-
count = count + cls.get_dir_all_file_num(path, ext)
|
|
225
|
-
return count
|
|
226
|
-
|
|
227
|
-
@classmethod
|
|
228
|
-
def get_dir_all_file_size(cls, dirpath, ext=None):
|
|
229
|
-
"""
|
|
230
|
-
获取目录下所有文件的总大小
|
|
231
|
-
:return:
|
|
232
|
-
"""
|
|
233
|
-
count = 0
|
|
234
|
-
for path in cls.get_dir_all_files(dirpath):
|
|
235
|
-
if BaseFile.is_file(path):
|
|
236
|
-
if ext is not None:
|
|
237
|
-
if path.endswith(ext):
|
|
238
|
-
count = count + BaseFile.get_file_size(path)
|
|
239
|
-
elif cls.is_dir(path):
|
|
240
|
-
count = count + cls.get_dir_all_file_num(path, ext)
|
|
241
|
-
return count
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
import warnings
|
|
4
|
+
|
|
5
|
+
from re_common.baselibrary.utils.basefile import BaseFile
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class BaseDir(object):
|
|
9
|
+
|
|
10
|
+
@classmethod
|
|
11
|
+
def get_dir_all_files(cls, path):
|
|
12
|
+
"""
|
|
13
|
+
返回所有的文件 不会返回目录 目的是得到一个文件列表
|
|
14
|
+
# 这里注意topdown参数。
|
|
15
|
+
# topdown决定遍历的顺序,
|
|
16
|
+
# 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
|
|
17
|
+
# 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
|
|
18
|
+
# 我们需要先修改深层的子目录
|
|
19
|
+
:param path: 给定一个路径 如 C:/Users/XD/Pictures/所有视频/
|
|
20
|
+
:return:
|
|
21
|
+
"""
|
|
22
|
+
# 遍历子目录
|
|
23
|
+
assert cls.is_dir(path), NotADirectoryError(path + " not is a dir please check")
|
|
24
|
+
for path, dirNames, fileNames in os.walk(path, topdown=True):
|
|
25
|
+
# 获取当前目录的所有文件
|
|
26
|
+
for fileName in fileNames:
|
|
27
|
+
yield os.path.join(path, fileName)
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def get_dir_all_dir(cls, s_path):
|
|
31
|
+
"""
|
|
32
|
+
获取目录下的最深子目录
|
|
33
|
+
# 这里注意topdown参数。
|
|
34
|
+
# topdown决定遍历的顺序,
|
|
35
|
+
# 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
|
|
36
|
+
# 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
|
|
37
|
+
# 我们需要先修改深层的子目录
|
|
38
|
+
:param path: 给定一个路径 如 C:/Users/XD/Pictures/所有视频/
|
|
39
|
+
:return:
|
|
40
|
+
"""
|
|
41
|
+
# 遍历子目录
|
|
42
|
+
assert cls.is_dir(s_path), NotADirectoryError(s_path + " not is a dir please check")
|
|
43
|
+
for path, dirNames, fileNames in os.walk(s_path, topdown=False):
|
|
44
|
+
# 获取当前目录的所有文件
|
|
45
|
+
for one_dir in dirNames:
|
|
46
|
+
f_path = os.path.join(path, one_dir)
|
|
47
|
+
for path1, dirNames1, fileNames1 in os.walk(f_path):
|
|
48
|
+
if len(dirNames1) == 0:
|
|
49
|
+
yield f_path
|
|
50
|
+
# break 原因是当一个目录有子目录时 会循环子目录,所以一次判断就可以了
|
|
51
|
+
break
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
def is_dir_exists(cls, pathdir):
|
|
55
|
+
"""
|
|
56
|
+
目录是否存在
|
|
57
|
+
:param sPth:
|
|
58
|
+
:return:
|
|
59
|
+
"""
|
|
60
|
+
return os.path.exists(pathdir)
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def create_dir(cls, pathdir):
|
|
64
|
+
"""
|
|
65
|
+
创建目录 该方法可以创建多级目录
|
|
66
|
+
os.mkdir(pathdir)是创建一级目录 该目录的上级目录必须存在
|
|
67
|
+
:param pathdir:
|
|
68
|
+
:return:
|
|
69
|
+
"""
|
|
70
|
+
if not cls.is_dir_exists(pathdir):
|
|
71
|
+
os.makedirs(pathdir)
|
|
72
|
+
|
|
73
|
+
@classmethod
|
|
74
|
+
def get_upper_dir(cls, curPath: str, num: int) -> str:
|
|
75
|
+
"""
|
|
76
|
+
获取上几层的目录,如果包含文件名 -1 代表着这个文件的目录
|
|
77
|
+
:param curPath:
|
|
78
|
+
:param num:
|
|
79
|
+
:return:
|
|
80
|
+
"""
|
|
81
|
+
# 如果不是个整数
|
|
82
|
+
if not isinstance(num, int) or num > 0:
|
|
83
|
+
warnings.warn("this not int or num > 0 , The path is not processed, return curPath")
|
|
84
|
+
return curPath
|
|
85
|
+
pathlist = curPath.split(os.sep)
|
|
86
|
+
if abs(num) > (len(pathlist) - 1):
|
|
87
|
+
warnings.warn("this path length < num ,will return root dir ")
|
|
88
|
+
num = (len(pathlist) - 1) * (-1)
|
|
89
|
+
pathlist = pathlist[:num]
|
|
90
|
+
TopPath = os.sep.join(pathlist)
|
|
91
|
+
return TopPath
|
|
92
|
+
|
|
93
|
+
@classmethod
|
|
94
|
+
def get_file_dir_absolute(cls, file):
|
|
95
|
+
"""
|
|
96
|
+
请传入 __file__ 作为参数
|
|
97
|
+
获取一个文件的绝对路径
|
|
98
|
+
:param __file__:
|
|
99
|
+
:return:
|
|
100
|
+
"""
|
|
101
|
+
curPath = os.path.dirname(os.path.abspath(file))
|
|
102
|
+
return curPath
|
|
103
|
+
|
|
104
|
+
@classmethod
|
|
105
|
+
def is_dir(cls, spath):
|
|
106
|
+
if os.path.isdir(spath):
|
|
107
|
+
return True
|
|
108
|
+
return False
|
|
109
|
+
|
|
110
|
+
@classmethod
|
|
111
|
+
def get_dir_size(cls, dirpath):
|
|
112
|
+
"""
|
|
113
|
+
1eb = 1024pb
|
|
114
|
+
1pb = 1024tb
|
|
115
|
+
1tb = 1024gb
|
|
116
|
+
1gb = 1024mb
|
|
117
|
+
1mb = 1024kb
|
|
118
|
+
1kb = 1024b
|
|
119
|
+
上面的b是Byte
|
|
120
|
+
1Byte = 8bit
|
|
121
|
+
:param dirpath:
|
|
122
|
+
:return: 这里返回的是Byte大小
|
|
123
|
+
"""
|
|
124
|
+
size = 0
|
|
125
|
+
for filepath in cls.get_dir_all_files(dirpath):
|
|
126
|
+
size += sum(BaseFile.get_file_size(filepath))
|
|
127
|
+
return size
|
|
128
|
+
|
|
129
|
+
@classmethod
|
|
130
|
+
def copy_file_to_dir(cls, filePath, tarDirPath):
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
:param filePath: 文件路径
|
|
134
|
+
:param tarDirPath: 目录或文件路径
|
|
135
|
+
:return:
|
|
136
|
+
"""
|
|
137
|
+
assert BaseFile.is_file_exists(filePath), FileNotFoundError("需要copy的文件不存在")
|
|
138
|
+
assert BaseFile.is_file(filePath), FileNotFoundError("需要copy的不是一个文件")
|
|
139
|
+
cls.create_dir(tarDirPath)
|
|
140
|
+
shutil.copy(filePath, tarDirPath)
|
|
141
|
+
|
|
142
|
+
@classmethod
|
|
143
|
+
def copy_dir_to_dir(cls, oldDir, newDir, moudle=0):
|
|
144
|
+
"""
|
|
145
|
+
olddir和newdir都只能是目录,且newdir必须不存在
|
|
146
|
+
:param oldDir:
|
|
147
|
+
:param newDir:
|
|
148
|
+
:return:
|
|
149
|
+
"""
|
|
150
|
+
assert cls.is_dir(oldDir), IsADirectoryError(oldDir + "目录不存在")
|
|
151
|
+
if moudle == 0:
|
|
152
|
+
# 该模式下新目录必须不存在
|
|
153
|
+
assert not cls.is_dir(newDir), IsADirectoryError(newDir + "目录存在,不能使用该模式,推荐使用模式2")
|
|
154
|
+
shutil.copytree(oldDir, newDir)
|
|
155
|
+
elif moudle == 1:
|
|
156
|
+
# 该模式下如果新目录存在先删除新目录
|
|
157
|
+
if cls.is_dir(newDir):
|
|
158
|
+
cls.delete_dir(newDir)
|
|
159
|
+
shutil.copytree(oldDir, newDir)
|
|
160
|
+
elif moudle == 3:
|
|
161
|
+
# 该模式下通过替换进行copy
|
|
162
|
+
pass
|
|
163
|
+
elif moudle == 4:
|
|
164
|
+
# 该模式会跳过已存在的文件 只将新文件放入其中
|
|
165
|
+
pass
|
|
166
|
+
|
|
167
|
+
@classmethod
|
|
168
|
+
def delete_dir(cls, dirpath):
|
|
169
|
+
"""
|
|
170
|
+
os.rmdir(dirpath) 只能删除空目录
|
|
171
|
+
os.removedirs(path) 递归的删除目录
|
|
172
|
+
:param dirpath:
|
|
173
|
+
:return:
|
|
174
|
+
"""
|
|
175
|
+
shutil.rmtree(dirpath)
|
|
176
|
+
|
|
177
|
+
@classmethod
|
|
178
|
+
def replace_dir_special_string(cls, strings):
|
|
179
|
+
"""
|
|
180
|
+
windows 目录非法字符
|
|
181
|
+
:param strings:
|
|
182
|
+
:return:
|
|
183
|
+
"""
|
|
184
|
+
strings1 = strings.replace("/", "").replace("\\", "") \
|
|
185
|
+
.replace(":", "").replace("*", "").replace("\"", "") \
|
|
186
|
+
.replace("<", "").replace(">", "").replace("|", "") \
|
|
187
|
+
.replace("?", "")
|
|
188
|
+
return strings1
|
|
189
|
+
|
|
190
|
+
@classmethod
|
|
191
|
+
def remove_file_suf(cls, dirpath, suf):
|
|
192
|
+
for file in cls.get_dir_all_files(dirpath):
|
|
193
|
+
if file.endswith(suf):
|
|
194
|
+
BaseFile.remove_file(file)
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def is_null_dir(cls, dirpath):
|
|
198
|
+
"""
|
|
199
|
+
是否为空目录
|
|
200
|
+
:param dirpath:
|
|
201
|
+
:return:
|
|
202
|
+
"""
|
|
203
|
+
if not os.listdir(dirpath):
|
|
204
|
+
return True
|
|
205
|
+
return False
|
|
206
|
+
|
|
207
|
+
@classmethod
|
|
208
|
+
def get_dir_file_num(cls, dirpath):
|
|
209
|
+
return len([name for name in os.listdir(dirpath) if os.path.isfile(os.path.join(dirpath, name))])
|
|
210
|
+
|
|
211
|
+
@classmethod
|
|
212
|
+
def get_dir_all_file_num(cls, dirpath, ext=None):
|
|
213
|
+
"""
|
|
214
|
+
获取目录下所有文件个数,包含目录下目录的个数
|
|
215
|
+
:return:
|
|
216
|
+
"""
|
|
217
|
+
count = 0
|
|
218
|
+
for path in cls.get_dir_all_files(dirpath):
|
|
219
|
+
if BaseFile.is_file(path):
|
|
220
|
+
if ext is not None:
|
|
221
|
+
if path.endswith(ext):
|
|
222
|
+
count += 1
|
|
223
|
+
elif cls.is_dir(path):
|
|
224
|
+
count = count + cls.get_dir_all_file_num(path, ext)
|
|
225
|
+
return count
|
|
226
|
+
|
|
227
|
+
@classmethod
|
|
228
|
+
def get_dir_all_file_size(cls, dirpath, ext=None):
|
|
229
|
+
"""
|
|
230
|
+
获取目录下所有文件的总大小
|
|
231
|
+
:return:
|
|
232
|
+
"""
|
|
233
|
+
count = 0
|
|
234
|
+
for path in cls.get_dir_all_files(dirpath):
|
|
235
|
+
if BaseFile.is_file(path):
|
|
236
|
+
if ext is not None:
|
|
237
|
+
if path.endswith(ext):
|
|
238
|
+
count = count + BaseFile.get_file_size(path)
|
|
239
|
+
elif cls.is_dir(path):
|
|
240
|
+
count = count + cls.get_dir_all_file_num(path, ext)
|
|
241
|
+
return count
|