Jelajahi Sumber

添加了{os.sep},方便移植

Huan 5 tahun lalu
induk
melakukan
6755cd125e

+ 2 - 1
algebraicfactory/template.py

@@ -1,4 +1,5 @@
 from abc import ABCMeta, abstractmethod
+
 from sympy import simplify, count_ops, Float, Integer, Rational, sympify, factor, factor_list, expand, collect, Add, \
     Mul, ratsimp, cancel, apart, together, radsimp, trigsimp, expand_trig, expand_mul, expand_multinomial, powdenest, \
     powsimp, expand_power_base, expand_power_exp, logcombine, expand_log, ceiling, expand_complex, expand_func, Eq, \
@@ -41,7 +42,7 @@ class AlgebraSymbolBase(AlgebraInit, metaclass=ABCMeta):
         pass
 
 
-@plugin_class_loading(get_path(r"template/algebraicfactory"))
+@plugin_class_loading(get_path(fr"template{os.sep}algebraicfactory"))
 class AlgebraSymbol(AlgebraSymbolBase):
     def del_symbol(self, x):
         del self.symbol_describe[x]

+ 2 - 2
crawler/controller.py

@@ -52,9 +52,9 @@ class PageParser(PageParserAutomation, PageParserBrowser, PageParserData, PagePa
                     value_box.append(f"{i} = {self.element_dict[i]}")
             update_func(func_name, success_code, value_box)  # 信息更新系统
 
-        update_log("start")
+        update_log("开始解析")
         for func_num in range(len(func_list)):
             func_name = func_list[func_num]
             update_log(func_name)
             status = self.func_dict[func_name](num=f"{func_num}", name="var")
-        update_log("Finish")
+        update_log("运行完成")

+ 2 - 0
crawler/gui.py

@@ -548,7 +548,9 @@ class API(UIAPI):
             loader.stop()  # 把之前的停止
             while start_loader_stop:
                 if url.is_finish():
+                    API.update_run_status_gui('暂无URL', 'No status', [])
                     break
+                API.update_run_status_gui('呼叫浏览器...', 'No status', [])
                 loader.start_to_run(func_cookie=API.update_cookies_box_gui)
                 API.update_url_box_gui()
                 page_parser.element_interaction(API.update_run_status_gui)

+ 8 - 8
crawler/template.py

@@ -64,7 +64,7 @@ class Database(metaclass=ABCMeta):
 
 class CoTanDB(Database):
     def __init__(self, name):
-        self.dir = rf"{os.getcwd()}/Database_dir/{name}.cotanDB"  # 创建DB文件
+        self.dir = rf"{os.getcwd()}{os.sep}Database_dir{os.sep}{name}.cotanDB"  # 创建DB文件
         self.file = open(self.dir, "r+" if os.path.exists(self.dir) else "w+")
         self.id = 0
         self.name = name
@@ -94,7 +94,7 @@ class CoTanDB(Database):
         os.remove(self.dir)
 
     def out_file(self, out_dir):
-        with open(out_dir + fr"/{self.name}.contanDB", "w") as f:
+        with open(out_dir + fr"{os.sep}{self.name}.contanDB", "w") as f:
             with open(self.dir) as g:
                 f.write(g.read())
 
@@ -177,7 +177,7 @@ class Log(LogBase):
     def __init__(self, log_dir):
         self.log_dir = log_dir
         self.log_file = open(
-            log_dir + "/log.coTanLog",
+            log_dir + f"{os.sep}log.coTanLog",
             "r+" if os.path.exists(log_dir + "log.coTanLog") else "w+",
         )
 
@@ -315,8 +315,8 @@ class Urlbase(metaclass=ABCMeta):
     def __init__(self, dic=f"", dic_run=f""):
         Urlbase.url_count += 1
         self.save_dir = dic
-        dic += f"/url[{Urlbase.url_count}].cot_url"
-        dic_run += f"/url_run[{Urlbase.url_count}].cot_url"
+        dic += f"{os.sep}url[{Urlbase.url_count}].cot_url"
+        dic_run += f"{os.sep}url_run[{Urlbase.url_count}].cot_url"
         self.dir = dic
         self.dir_run = dic_run
         self.file = open(dic, "a")  # 写入url_history的文件
@@ -1284,7 +1284,7 @@ class PageParserDataSource(PageParserFunc):
             md5 = hashlib.md5()  # 应用MD5算法
             md5.update(f"{time.time()}_{self.url_text}".encode("utf-8"))
             name = md5.hexdigest()
-            save_dir = self.dir + "/" + name + ".cotan_source"
+            save_dir = self.dir + f"{os.sep}" + name + ".cotan_source"
             print(save_dir)
             with open(save_dir, "w") as f:
                 f.write(self.element_dict[element_value][0])
@@ -1380,9 +1380,9 @@ class PageParserTool(PageParserFunc):
             md5 = hashlib.md5()  # 应用MD5算法
             md5.update(f"{time.time()}_{self.url_text}".encode("utf-8"))
             name = md5.hexdigest()
-            with open(self.dir + "/" + name + ".png.CoTanURL", "w") as f:
+            with open(self.dir + f"{os.sep}" + name + ".png.CoTanURL", "w") as f:
                 f.write(self.url_text)
-            self.browser.save_screenshot(self.dir + "/" + name + ".png")
+            self.browser.save_screenshot(self.dir + f"{os.sep}" + name + ".png")
             sleep(1)
 
         self.add_func(f"Webpage_snapshot", action)  # 添加func

+ 4 - 4
datascience/gui.py

@@ -666,7 +666,7 @@ class API(UIAPI):
     @staticmethod
     def new_render(c, name):
         if API.get_draw_as_well_gui():
-            c.render(f"{PATH}\\{name}.html")
+            c.render(fr"{PATH}{os.sep}{name}.html")
         API.update_render_box_gui()
 
     @staticmethod
@@ -970,7 +970,7 @@ class API(UIAPI):
     def show_report():
         if not API.askokcancel_gui(f"是否统计数据,大量的数据需要耗费一定的时间(确定后,系统会在后台统计)"):
             raise Exception
-        report_dir = f"{PATH}/$Show_Des_Sheet.html"
+        report_dir = f"{PATH}{os.sep}$Show_Des_Sheet.html"
         try:
             name = API.get_sheet_name_gui()
             if name is None:
@@ -1009,7 +1009,7 @@ class API(UIAPI):
     @staticmethod
     def show_one_sheet_html():
         global PATH, to_html_type
-        html_dir = f"{PATH}/$Show_Sheet.html"
+        html_dir = f"{PATH}{os.sep}$Show_Sheet.html"
         try:
             name = API.get_sheet_name_gui()
             if name is None:
@@ -1022,7 +1022,7 @@ class API(UIAPI):
     @staticmethod
     def show_sheet_html():
         global PATH, to_html_type
-        html_dir = f"{PATH}/$Show_Sheet.html"
+        html_dir = f"{PATH}{os.sep}$Show_Sheet.html"
         try:
             name = API.get_sheet_name_gui()
             if name is None:

+ 2 - 1
datascience/template.py

@@ -2,6 +2,7 @@ from abc import ABCMeta, abstractmethod
 from random import randint
 import re
 from os import getcwd
+import os
 
 import numpy as np
 from sklearn.feature_extraction import DictVectorizer
@@ -19,7 +20,7 @@ from pyecharts.globals import CurrentConfig
 from pyecharts.globals import GeoType  # 地图推荐使用GeoType而不是str
 from system import plugin_class_loading, get_path
 
-CurrentConfig.ONLINE_HOST = f"{getcwd()}/assets/"
+CurrentConfig.ONLINE_HOST = f"{getcwd()}{os.sep}assets{os.sep}"
 
 
 class FormBase(metaclass=ABCMeta):

+ 1 - 1
draftboard/board.py

@@ -40,7 +40,7 @@ mode = {1: '绘制坐标系', 2: '绘制直线(g)', 3: '填充矩形(f)', 4: '
 SCREEN_X = 900
 SCREEN_Y = 700
 init_done = pygame.init()  # 初始化所有模块
-FONT = pygame.font.Font(r'Font\ZKST.ttf', 16)  # 设置字体(Linux下应该用\而不是/)
+FONT = pygame.font.Font(fr'Font{os.sep}ZKST.ttf', 16)  # 设置字体(Linux下应该用\而不是/)
 SCREEN = pygame.display.set_mode((SCREEN_X, SCREEN_Y), 0)  # 创建屏幕
 SCREEN_CAPTION = pygame.display.set_caption('CoTan草稿板')  # 定义标题(后期加上定义Logo)
 SCREEN.fill([255, 255, 255])  # 默认用白色填充窗口

+ 2 - 1
funcsystem/factory.py

@@ -2,6 +2,7 @@ from __future__ import division  # 让/恢复为除法
 import random
 import tkinter
 import tkinter.messagebox
+import os
 
 import sympy
 from matplotlib import pyplot as plt
@@ -787,7 +788,7 @@ SCREEN["bg"] = bg_color
 SCREEN.title("CoTan函数工厂")
 SCREEN.resizable(width=False, height=False)
 SCREEN.geometry("+10+10")
-FONT = (r"Font\ZKST.ttf", 11)  # 设置字体
+FONT = (rf"Font{os.sep}ZKST.ttf", 11)  # 设置字体
 rcParams["font.family"] = "simhei"
 rcParams["axes.unicode_minus"] = False
 tkinter.Label(

+ 2 - 1
funcsystem/map.py

@@ -1,4 +1,5 @@
 from os import path
+import os
 import math
 import random
 import tkinter
@@ -15,7 +16,7 @@ func_logger = []
 fig = None
 func_str_list = []
 prompt_num = 0
-FONT = (r"Font\ZKST.ttf", 11)  # 设置字体
+FONT = (fr"Font{os.sep}ZKST.ttf", 11)  # 设置字体
 SCREEN = tkinter.Tk()  # 设置屏幕
 bg_color = "#FFFAFA"  # 主颜色
 SCREEN["bg"] = bg_color

+ 3 - 2
gitrepo/template.py

@@ -498,9 +498,10 @@ class GitRepo(ViewClasses, NewClasses, RemoveClass, BackClasses, ParallelClasses
     def make_dir(self, dir):
         if len(dir) == "":
             return dir
-        inside = "/"
-        if dir[0] == "/":
+        if dir[0].startswith(os.sep):
             inside = ""
+        else:
+            inside = os.sep
         return self.repo_dir + inside + dir
 
 

+ 2 - 2
machinelearning/gui.py

@@ -647,7 +647,7 @@ class API(UIAPI):
 
     @staticmethod
     def to_html_one():
-        html_dir = f"{PATH}/$Show_Sheet.html"
+        html_dir = f"{PATH}{os.sep}$Show_Sheet.html"
         try:
             name = API.get_data_name_gui()
             if name is None:
@@ -659,7 +659,7 @@ class API(UIAPI):
 
     @staticmethod
     def to_html():
-        html_dir = f"{PATH}/$Show_Sheet.html"
+        html_dir = f"{PATH}{os.sep}$Show_Sheet.html"
         try:
             name = API.get_data_name_gui()
             if name is None:

+ 71 - 70
machinelearning/template.py

@@ -4,6 +4,7 @@ import tarfile
 from abc import ABCMeta, abstractmethod
 from os import getcwd, mkdir
 from os.path import split as path_split, splitext, basename, exists
+import os
 
 from sklearn.svm import SVC, SVR  # SVC是svm分类,SVR是svm回归
 from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
@@ -41,7 +42,7 @@ from pyecharts.globals import CurrentConfig
 
 from system import plugin_class_loading, get_path, plugin_func_loading
 
-CurrentConfig.ONLINE_HOST = f"{getcwd()}/assets/"
+CurrentConfig.ONLINE_HOST = f"{getcwd()}{os.sep}assets{os.sep}"
 
 
 # 设置
@@ -536,7 +537,7 @@ class StudyMachinebase(Machinebase):
             save_dir, "评分", [
                 precision, recall, f1], class_list, [
                 "精确率", "召回率", "F1"])
-        save = save_dir + r"/分类模型评估.HTML"
+        save = save_dir + rf"{os.sep}分类模型评估.HTML"
         tab.render(save)
         return save,
 
@@ -557,7 +558,7 @@ class StudyMachinebase(Machinebase):
         tab.add(make_tab(["MSE", "MAE", "RMSE", "r2_Score"], [
             [mse, mae, rmse, r2_score]]), "评估数据", )
 
-        save = save_dir + r"/回归模型评估.HTML"
+        save = save_dir + rf"{os.sep}回归模型评估.HTML"
         tab.render(save)
         return save,
 
@@ -617,7 +618,7 @@ class StudyMachinebase(Machinebase):
                 bar_(cofe_array, f"{a}%-{a + n}%数据轮廓系数")
                 a += n
 
-        save = save_dir + r"/聚类模型评估.HTML"
+        save = save_dir + rf"{os.sep}聚类模型评估.HTML"
         tab.render(save)
         return save,
 
@@ -770,7 +771,7 @@ class DataAnalysis(ToPyebase):  # 数据分析
         cumulative_calculation(data, np.max, "累计最大值", tab)
         cumulative_calculation(data, np.min, "累计最小值", tab)
 
-        save = save_dir + r"/数据分析.HTML"
+        save = save_dir + rf"{os.sep}数据分析.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -822,7 +823,7 @@ class Corr(ToPyebase):  # 相关性和协方差
 
         des_to_csv(save_dir, f"相关性矩阵", corr)
         des_to_csv(save_dir, f"协方差矩阵", cov)
-        save = save_dir + r"/数据相关性.HTML"
+        save = save_dir + rf"{os.sep}数据相关性.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -927,7 +928,7 @@ class MatrixScatter(ToPyebase):  # 矩阵散点图
             c = Scatter()
         tab.add(c, "矩阵散点图")
 
-        save = save_dir + r"/矩阵散点图.HTML"
+        save = save_dir + rf"{os.sep}矩阵散点图.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -938,15 +939,15 @@ class ClusterTree(ToPyebase):  # 聚类树状图
         x_data = self.x_traindata
         linkage_array = ward(x_data)  # self.y_traindata是结果
         dendrogram(linkage_array)
-        plt.savefig(save_dir + r"/Cluster_graph.png")
+        plt.savefig(save_dir + rf"{os.sep}Cluster_graph.png")
 
         image = Image()
-        image.add(src=save_dir + r"/Cluster_graph.png",).set_global_opts(
+        image.add(src=save_dir + rf"{os.sep}Cluster_graph.png",).set_global_opts(
             title_opts=opts.ComponentTitleOpts(title="聚类树状图")
         )
         tab.add(image, "聚类树状图")
 
-        save = save_dir + r"/聚类树状图.HTML"
+        save = save_dir + rf"{os.sep}聚类树状图.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1031,7 +1032,7 @@ class ClassBar(ToPyebase):  # 类型柱状图
             tab.add(c, f"类型-[{num_i}]特征统计柱状图")
 
         # 未完成
-        save = save_dir + r"/特征统计.HTML"
+        save = save_dir + rf"{os.sep}特征统计.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1069,7 +1070,7 @@ class NumpyHeatMap(ToPyebase):  # Numpy矩阵绘制热力图
         tab.add(c, "矩阵热力图")
         tab.add(make_tab(x, data.transpose().tolist()), f"矩阵热力图:表格")
 
-        save = save_dir + r"/矩阵热力图.HTML"
+        save = save_dir + rf"{os.sep}矩阵热力图.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1155,7 +1156,7 @@ class PredictiveHeatmapBase(ToPyebase):  # 绘制预测型热力图
             c = Table().add(headers=heard, rows=[data])
             tab.add(c, "数据表")
 
-        save = save_dir + r"/预测热力图.HTML"
+        save = save_dir + rf"{os.sep}预测热力图.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1193,7 +1194,7 @@ class NearFeatureScatterClassMore(ToPyebase):
         c = Table().add(headers=heard, rows=[data])
         tab.add(c, "数据表")
 
-        save = save_dir + r"/数据特征散点图(分类).HTML"
+        save = save_dir + rf"{os.sep}数据特征散点图(分类).HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1213,7 +1214,7 @@ class NearFeatureScatterMore(ToPyebase):
         c = Table().add(headers=heard, rows=[data])
         tab.add(c, "数据表")
 
-        save = save_dir + r"/数据特征散点图.HTML"
+        save = save_dir + rf"{os.sep}数据特征散点图.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1237,7 +1238,7 @@ class NearFeatureScatterClass(ToPyebase):  # 临近特征散点图:分类数
         c = Table().add(headers=heard, rows=[data])
         tab.add(c, "数据表")
 
-        save = save_dir + r"/临近数据特征散点图(分类).HTML"
+        save = save_dir + rf"{os.sep}临近数据特征散点图(分类).HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1256,7 +1257,7 @@ class NearFeatureScatter(ToPyebase):  # 临近特征散点图:连续数据
         data = [f"{i}" for i in x_means]
         tab.add(make_tab(columns, [data]), "数据表")
 
-        save = save_dir + r"/临近数据特征散点图.HTML"
+        save = save_dir + rf"{os.sep}临近数据特征散点图.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1275,7 +1276,7 @@ class FeatureScatterYX(ToPyebase):  # y-x图
         data = [f"{i}" for i in x_means]
         tab.add(make_tab(columns, [data]), "数据表")
 
-        save = save_dir + r"/特征y-x图像.HTML"
+        save = save_dir + rf"{os.sep}特征y-x图像.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1347,7 +1348,7 @@ class LineModel(StudyMachinebase):
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
 
-        save = save_dir + r"/线性回归模型.HTML"
+        save = save_dir + rf"{os.sep}线性回归模型.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1417,7 +1418,7 @@ class LogisticregressionModel(StudyMachinebase):
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
 
-        save = save_dir + r"/逻辑回归.HTML"
+        save = save_dir + rf"{os.sep}逻辑回归.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1539,7 +1540,7 @@ class KnnModel(StudyMachinebase):
             [[f"{i}" for i in x_means]],
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
-        save = save_dir + r"/K.HTML"
+        save = save_dir + rf"{os.sep}K.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1580,7 +1581,7 @@ class TreeModel(StudyMachinebase):
         tab = Tab()
         importance = self.model.feature_importances_.tolist()
 
-        with open(save_dir + r"\Tree_Gra.dot", "w") as f:
+        with open(save_dir + fr"{os.sep}Tree_Gra.dot", "w") as f:
             export_graphviz(self.model, out_file=f)
 
         make_bar("特征重要性", importance, tab)
@@ -1590,7 +1591,7 @@ class TreeModel(StudyMachinebase):
             [importance],
             [f"[{i}]特征" for i in range(len(importance))],
         )
-        tab.add(see_tree(save_dir + r"\Tree_Gra.dot"), "决策树可视化")
+        tab.add(see_tree(save_dir + fr"{os.sep}Tree_Gra.dot"), "决策树可视化")
 
         y = self.y_traindata
         x_data = self.x_traindata
@@ -1651,7 +1652,7 @@ class TreeModel(StudyMachinebase):
             [[f"{i}" for i in x_means]],
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
-        save = save_dir + r"/决策树.HTML"
+        save = save_dir + rf"{os.sep}决策树.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1692,13 +1693,13 @@ class ForestModel(StudyMachinebase):
         tab = Tab()
         # 多个决策树可视化
         for i in range(len(self.model.estimators_)):
-            with open(save_dir + rf"\Tree_Gra[{i}].dot", "w") as f:
+            with open(save_dir + rf"{os.sep}Tree_Gra[{i}].dot", "w") as f:
                 export_graphviz(self.model.estimators_[i], out_file=f)
 
             tab.add(
                 see_tree(
                     save_dir +
-                    rf"\Tree_Gra[{i}].dot"),
+                    rf"{os.sep}Tree_Gra[{i}].dot"),
                 f"[{i}]决策树可视化")
 
         y = self.y_traindata
@@ -1747,7 +1748,7 @@ class ForestModel(StudyMachinebase):
             [[f"{i}" for i in x_means]],
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
-        save = save_dir + r"/随机森林.HTML"
+        save = save_dir + rf"{os.sep}随机森林.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1791,13 +1792,13 @@ class GradienttreeModel(StudyMachinebase):  # 继承Tree_Model主要是继承Des
         # 多个决策树可视化
         for a in range(len(self.model.estimators_)):
             for i in range(len(self.model.estimators_[a])):
-                with open(save_dir + rf"\Tree_Gra[{a},{i}].dot", "w") as f:
+                with open(save_dir + rf"{os.sep}Tree_Gra[{a},{i}].dot", "w") as f:
                     export_graphviz(self.model.estimators_[a][i], out_file=f)
 
                 tab.add(
                     see_tree(
                         save_dir +
-                        rf"\Tree_Gra[{a},{i}].dot"),
+                        rf"{os.sep}Tree_Gra[{a},{i}].dot"),
                     f"[{a},{i}]决策树可视化")
 
         y = self.y_traindata
@@ -1846,7 +1847,7 @@ class GradienttreeModel(StudyMachinebase):  # 继承Tree_Model主要是继承Des
             [[f"{i}" for i in x_means]],
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
-        save = save_dir + r"/梯度提升回归树.HTML"
+        save = save_dir + rf"{os.sep}梯度提升回归树.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1924,7 +1925,7 @@ class SvcModel(StudyMachinebase):
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
 
-        save = save_dir + r"/支持向量机分类.HTML"
+        save = save_dir + rf"{os.sep}支持向量机分类.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -1994,7 +1995,7 @@ class SvrModel(StudyMachinebase):
             ),
             "数据表",
         )
-        save = save_dir + r"/支持向量机回归.HTML"
+        save = save_dir + rf"{os.sep}支持向量机回归.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2029,7 +2030,7 @@ class VarianceModel(Unsupervised):  # 无监督
             )
         )
         tab.add(c, "数据标准差")
-        save = save_dir + r"/方差特征选择.HTML"
+        save = save_dir + rf"{os.sep}方差特征选择.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2095,7 +2096,7 @@ class SelectkbestModel(PrepBase):  # 有监督
         )
         tab.add(c, "单变量重要程度")
 
-        save = save_dir + r"/单一变量特征选择.HTML"
+        save = save_dir + rf"{os.sep}单一变量特征选择.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2184,7 +2185,7 @@ class SelectFromModel(PrepBase):  # 有监督
             except BaseException:
                 pass
 
-        save = save_dir + r"/模型特征选择.HTML"
+        save = save_dir + rf"{os.sep}模型特征选择.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2210,7 +2211,7 @@ class StandardizationModel(Unsupervised):  # z-score标准化 无监督
         make_bar("方差", means, tab)
         make_bar("Scale", scale, tab)
 
-        save = save_dir + r"/z-score标准化.HTML"
+        save = save_dir + rf"{os.sep}z-score标准化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2241,7 +2242,7 @@ class MinmaxscalerModel(Unsupervised):  # 离差标准化
             "数据表格",
         )
 
-        save = save_dir + r"/离差标准化.HTML"
+        save = save_dir + rf"{os.sep}离差标准化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2281,7 +2282,7 @@ class LogscalerModel(PrepBase):  # 对数标准化
         tab.add(make_tab(heard=["最大对数值(自然对数)"],
                          row=[[str(self.max_logx)]]), "数据表格")
 
-        save = save_dir + r"/对数标准化.HTML"
+        save = save_dir + rf"{os.sep}对数标准化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2311,7 +2312,7 @@ class AtanscalerModel(PrepBase):  # atan标准化
         x_data = self.x_testdata
         conversion_control(y_data, x_data, tab)
 
-        save = save_dir + r"/反正切函数标准化.HTML"
+        save = save_dir + rf"{os.sep}反正切函数标准化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2352,7 +2353,7 @@ class DecimalscalerModel(PrepBase):  # 小数定标准化
         conversion_control(y_data, x_data, tab)
         tab.add(make_tab(heard=["小数位数:j"], row=[[j]]), "数据表格")
 
-        save = save_dir + r"/小数定标标准化.HTML"
+        save = save_dir + rf"{os.sep}小数定标标准化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2399,7 +2400,7 @@ class MapzoomModel(PrepBase):  # 映射标准化
         conversion_control(y_data, x_data, tab)
         tab.add(make_tab(heard=["最大值", "最小值"], row=[[max_, min_]]), "数据表格")
 
-        save = save_dir + r"/映射标准化.HTML"
+        save = save_dir + rf"{os.sep}映射标准化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2429,7 +2430,7 @@ class SigmodscalerModel(PrepBase):  # sigmod变换
         x_data = self.x_testdata
         conversion_control(y_data, x_data, tab)
 
-        save = save_dir + r"/Sigmoid变换.HTML"
+        save = save_dir + rf"{os.sep}Sigmoid变换.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2476,7 +2477,7 @@ class FuzzyQuantizationModel(PrepBase):  # 模糊量化标准化
         conversion_control(y_data, x_data, tab)
         tab.add(make_tab(heard=["最大值", "最小值"], row=[[max_, min_]]), "数据表格")
 
-        save = save_dir + r"/模糊量化标准化.HTML"
+        save = save_dir + rf"{os.sep}模糊量化标准化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2495,7 +2496,7 @@ class RegularizationModel(Unsupervised):  # 正则化
         x_data = self.x_testdata.copy()
         conversion_control(y_data, x_data, tab)
 
-        save = save_dir + r"/正则化.HTML"
+        save = save_dir + rf"{os.sep}正则化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2527,7 +2528,7 @@ class BinarizerModel(Unsupervised):  # 二值化
                 heard, np.dstack(
                     (x_data, y_data)).tolist()), f"合成[原数据,编码]数据")
 
-        save = save_dir + r"/二值离散化.HTML"
+        save = save_dir + rf"{os.sep}二值离散化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2592,7 +2593,7 @@ class DiscretizationModel(PrepBase):  # n值离散
                 heard, np.dstack(
                     (x_data, y_data)).tolist()), f"合成[原数据,编码]数据")
 
-        save = save_dir + r"/多值离散化.HTML"
+        save = save_dir + rf"{os.sep}多值离散化.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2643,7 +2644,7 @@ class LabelModel(PrepBase):  # 数字编码
                 heard, np.dstack(
                     (x_data, y_data)).tolist()), f"合成[原数据,编码]数据")
 
-        save = save_dir + r"/数字编码.HTML"
+        save = save_dir + rf"{os.sep}数字编码.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2718,7 +2719,7 @@ class OneHotEncoderModel(PrepBase):  # 独热编码
                     (oh_data, x_data)).tolist()), f"合成[原数据,编码]数据")
         tab.add(make_tab([f"编码:{i}" for i in range(
             len(y_data[0]))], y_data.tolist()), f"数据")
-        save = save_dir + r"/独热编码.HTML"
+        save = save_dir + rf"{os.sep}独热编码.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2750,7 +2751,7 @@ class MissedModel(Unsupervised):  # 缺失数据补充
         conversion_control(y_data, x_data, tab)
         tab.add(make_tab([f"特征[{i}]" for i in range(
             len(statistics))], [statistics]), "填充值")
-        save = save_dir + r"/缺失数据填充.HTML"
+        save = save_dir + rf"{os.sep}缺失数据填充.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2826,7 +2827,7 @@ class PcaModel(Unsupervised):
                     len(var))])
 
         tab.add(c, "方量差柱状图")
-        save = save_dir + r"/主成分分析.HTML"
+        save = save_dir + rf"{os.sep}主成分分析.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2900,7 +2901,7 @@ class RpcaModel(Unsupervised):
             save_dir, "方量差", [var], [
                 f"第[{i}]主成分" for i in range(
                     len(var))])
-        save = save_dir + r"/RPCA(主成分分析).HTML"
+        save = save_dir + rf"{os.sep}RPCA(主成分分析).HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2932,7 +2933,7 @@ class KpcaModel(Unsupervised):
         y_data = self.y_testdata
         conversion_separate_format(y_data, tab)
 
-        save = save_dir + r"/KPCA(主成分分析).HTML"
+        save = save_dir + rf"{os.sep}KPCA(主成分分析).HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -2969,7 +2970,7 @@ class LdaModel(PrepBase):  # 有监督学习
         for i in range(len(get)):
             tab.add(get[i].overlap(get[i]), f"类别:{i}LDA映射曲线")
 
-        save = save_dir + r"/render.HTML"
+        save = save_dir + rf"{os.sep}render.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3046,7 +3047,7 @@ class NmfModel(Unsupervised):
         des_to_csv(save_dir, "系数矩阵", h_data)
         des_to_csv(save_dir, "系数*权重矩阵", wh_data)
 
-        save = save_dir + r"/非负矩阵分解.HTML"
+        save = save_dir + rf"{os.sep}非负矩阵分解.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3077,7 +3078,7 @@ class TsneModel(Unsupervised):
         y_data = self.y_testdata
         conversion_separate_format(y_data, tab)
 
-        save = save_dir + r"/T-SNE.HTML"
+        save = save_dir + rf"{os.sep}T-SNE.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3171,7 +3172,7 @@ class MlpModel(StudyMachinebase):  # 神经网络(多层感知机),有监督
 
         tab.add(make_tab(heard, [data]), "数据表")
 
-        save = save_dir + r"/多层感知机.HTML"
+        save = save_dir + rf"{os.sep}多层感知机.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3236,7 +3237,7 @@ class KmeansModel(UnsupervisedModel):
             [[f"{i}" for i in x_means]],
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
-        save = save_dir + r"/k-means聚类.HTML"
+        save = save_dir + rf"{os.sep}k-means聚类.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3294,10 +3295,10 @@ class AgglomerativeModel(UnsupervisedModel):
 
         linkage_array = ward(self.x_traindata)  # self.y_traindata是结果
         dendrogram(linkage_array)
-        plt.savefig(save_dir + r"/Cluster_graph.png")
+        plt.savefig(save_dir + rf"{os.sep}Cluster_graph.png")
 
         image = Image()
-        image.add(src=save_dir + r"/Cluster_graph.png",).set_global_opts(
+        image.add(src=save_dir + rf"{os.sep}Cluster_graph.png",).set_global_opts(
             title_opts=opts.ComponentTitleOpts(title="聚类树状图")
         )
 
@@ -3314,7 +3315,7 @@ class AgglomerativeModel(UnsupervisedModel):
             [[f"{i}" for i in x_means]],
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
-        save = save_dir + r"/层次聚类.HTML"
+        save = save_dir + rf"{os.sep}层次聚类.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3377,7 +3378,7 @@ class DbscanModel(UnsupervisedModel):
             [[f"{i}" for i in x_means]],
             [f"普适预测第{i}特征" for i in range(len(x_means))],
         )
-        save = save_dir + r"/密度聚类.HTML"
+        save = save_dir + rf"{os.sep}密度聚类.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3472,7 +3473,7 @@ class FastFourier(StudyMachinebase):  # 快速傅里叶变换
                 self.frequency.tolist(), [
                     self.fourier.tolist()]), "快速傅里叶变换")
 
-        save = save_dir + r"/快速傅里叶.HTML"
+        save = save_dir + rf"{os.sep}快速傅里叶.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3540,7 +3541,7 @@ class ReverseFastFourier(StudyMachinebase):  # 快速傅里叶变换
             line("单边相位谱", phase[: int(n / 2)].tolist(), slice(0, int(n / 2))), "单边相位谱"
         )
 
-        save = save_dir + r"/快速傅里叶.HTML"
+        save = save_dir + rf"{os.sep}快速傅里叶.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3649,7 +3650,7 @@ def FUNC({",".join(model.__code__.co_varnames)}):
             "拟合参数",
         )
 
-        save = save_dir + r"/曲线拟合.HTML"
+        save = save_dir + rf"{os.sep}曲线拟合.HTML"
         tab.render(save)  # 生成HTML
         return save,
 
@@ -3674,7 +3675,7 @@ class Tab(tab_First):
         if all_global:
             render_dir = path_split(path)[0]
             for i in self.element:
-                self.element[i].render(render_dir + "/" + i + ".html")
+                self.element[i].render(render_dir + os.sep + i + ".html")
         return super(Tab, self).render(path, template_name, *args, **kwargs)
 
 
@@ -3703,7 +3704,7 @@ class Table(TableFisrt):
             name = splitext(name)[0]
             try:
                 DataFrame(self.ROWS, columns=self.HEADERS).to_csv(
-                    save_dir + "/" + name + ".csv"
+                    save_dir + os.sep + name + ".csv"
                 )
             except BaseException:
                 pass
@@ -4789,7 +4790,7 @@ def num_str(num, accuracy):
 
 @plugin_func_loading(get_path(r"template/machinelearning"))
 def des_to_csv(save_dir, name, data, columns=None, row=None):
-    save_dir = save_dir + "/" + name + ".csv"
+    save_dir = save_dir + os.sep + name + ".csv"
     print(columns)
     print(row)
     print(data)
@@ -5096,7 +5097,7 @@ class MachineLearnerScore(MachineLearnerInit, metaclass=ABCMeta):
         x = self.get_sheet(name_x)
         y = self.get_sheet(name_y)
         if new_dir_global:
-            dic = save_dir + f"/{learner}分类评分[CoTan]"
+            dic = save_dir + f"{os.sep}{learner}分类评分[CoTan]"
             new_dic = dic
             a = 0
             while exists(new_dic):  # 直到他不存在 —— False
@@ -5118,7 +5119,7 @@ class MachineLearnerScore(MachineLearnerInit, metaclass=ABCMeta):
 
     def model_visualization(self, learner, save_dir):  # 显示参数
         if new_dir_global:
-            dic = save_dir + f"/{learner}数据[CoTan]"
+            dic = save_dir + f"{os.sep}{learner}数据[CoTan]"
             new_dic = dic
             a = 0
             while exists(new_dic):  # 直到他不存在 —— False
@@ -5130,7 +5131,7 @@ class MachineLearnerScore(MachineLearnerInit, metaclass=ABCMeta):
         model = self.get_learner(learner)
         if (not (model.model is None) or not (
                 model.model is list)) and clf_global:
-            joblib.dump(model.model, new_dic + "/MODEL.model")  # 保存模型
+            joblib.dump(model.model, new_dic + f"{os.sep}MODEL.model")  # 保存模型
         # 打包
         save = model.data_visualization(new_dic)[0]
         if tar_global:

+ 1 - 1
system/__init__.py

@@ -11,7 +11,7 @@ def plugin_class_loading(template_path):
     # 装饰器,装饰类的,允许使用自定义插件
     def plugin_read(base):
         name = base.__name__
-        template = f'{template_path}/template_{name}.py'
+        template = f'{template_path}/template_{name}.py'.replace('/', os.sep)
         try:
             if os.path.exists(template):
                 with open(template, 'r') as f: