UGCProjects/Tool/utils.py

411 lines
9.6 KiB
Python
Raw Normal View History

2025-01-04 23:00:19 +08:00
import os
from operator import itemgetter, attrgetter
import re
import shutil
def remove_lua_comments(lua_script: str) -> str:
# 使用正则表达式去除多行注释
lua_script = re.sub(r'--+ *\[=*\[.*?]=*]', '', lua_script, flags=re.DOTALL)
# 使用正则表达式去除单行注释
lua_script = re.sub(r'--.*$', '', lua_script, flags=re.MULTILINE)
return lua_script
def extFileExtension(f: str) -> str:
values: list = f.split('.')
return values[len(values) - 1]
# 加载文件夹中所有文件
def listFiles(path: str, ext: str | list) -> list[str]:
files: list[str] = []
for filename in os.listdir(path):
file_path = os.path.join(path, filename)
localFileExt = extFileExtension(file_path)
if os.path.isfile(file_path):
if type(ext) is str:
if localFileExt == ext:
files.append(file_path)
elif type(ext) is list:
for i in ext:
if i == localFileExt:
files.append(file_path)
elif os.path.isdir(file_path):
for i in listFiles(file_path, ext):
files.append(i)
return files
def to_one_line(filename: str) -> str:
res = ""
with open(file=filename, mode="r+", encoding="utf-8") as file:
for line in file:
line.replace("\n", " ")
line.replace("\r", " ")
if line.endswith("\\"):
line.replace("\\", "\n")
res += line
file.close()
return res
def one_line(filecontent: str) -> str:
filecontent = filecontent.replace("\n", " ")
filecontent = filecontent.replace("\r\n", " ")
filecontent = filecontent.replace("\r", " ")
if filecontent.endswith("\\"):
filecontent = filecontent.replace("\\", "\n")
return filecontent
def load_file(filename: str, encode) -> str:
with open(file=filename, mode="r", encoding=encode) as f:
res = f.read()
f.close()
return res
# 判断文件是否存在,如果存在,则删除并重新创建;如果不存在,则创建
def file_exist(filename: str):
if os.path.exists(filename):
os.remove(filename)
target_folder_path = os.path.dirname(filename)
if not os.path.isdir(target_folder_path):
os.makedirs(target_folder_path)
with open(file=filename, mode="w") as f:
f.close()
def createFolder(foldername: str):
if os.path.exists(foldername):
return
os.makedirs(foldername)
def removeFiles(foldername: str):
shutil.rmtree(foldername)
def add_type(folder: str):
files = listFiles(folder, 'lua')
decode = 'utf-8'
simple = '--Edit Below--'
for i in files:
with open(i, mode='r', encoding=decode) as f:
content = f.read()
f.close()
# 说明当前是对应文件类
if content.startswith('---@class '):
names = re.findall('---@class (.*):', content)
if len(names) == 0:
continue
name = names[0]
type_name = '---@type ' + name
# 查找是否存在 @type
if content.find(type_name) != -1:
content = re.sub(simple + '\n' + type_name + '\r*\n*', simple + '\n' + type_name + '\n', content)
with open(i, mode='w', encoding=decode) as g:
g.write(content)
g.close()
continue
content = content.replace(simple, simple + '\n' + type_name)
content = re.sub(simple + '\n' + type_name + '\r*\n*', simple + '\n' + type_name + '\n', content)
with open(i, mode='w', encoding=decode) as f:
f.write(content)
f.close()
def write_to_file(filename: str, mode: str, content: str):
with open(file=filename, mode=mode, encoding='utf-8') as f:
f.write(content)
f.close()
class FileInfo:
lines: int
filename: str
def to_str(self):
return 'lines = %d, filename = %s' % (self.lines, self.filename)
# 按行读取文件,并放到表中
def file_to_map(file: str, file_map):
if file_map is None:
file_map = {}
with open(file=file, mode='r', encoding='utf-8') as f:
while True:
line = f.readline()
if not line:
break
line = line.strip()
if len(line) > 0:
if line not in file_map:
fi = FileInfo()
fi.filename = file
fi.lines = 1
file_map[line] = [fi]
else:
HadFound = False
for i in file_map[line]:
if i.filename == file:
i.lines += 1
HadFound = True
if not HadFound:
fi = FileInfo()
fi.filename = file
fi.lines = 1
file_map[line].append(fi)
f.close()
return file_map
def file_to_list(file: str, bRemoveComment):
with open(file=file, mode='r', encoding='utf-8') as f:
content = f.read()
if bRemoveComment:
content = remove_lua_comments(content)
files_map = content.split('\n')
f.close()
return files_map
def file_to_map1(file: str, file_map):
if file_map is None:
file_map = {}
with open(file=file, mode='r', encoding='utf-8') as f:
content = f.read()
content = remove_lua_comments(content)
line_list = content.split('\n')
for line in line_list:
line = line.strip()
if len(line) > 7:
if len(file_map) == 0 or line not in file_map:
fi = FileInfo()
fi.filename = file
fi.lines = 1
file_map[line] = [fi]
else:
HadFound = False
for i in file_map[line]:
if i.filename == file:
i.lines += 1
HadFound = True
if not HadFound:
fi = FileInfo()
fi.filename = file
fi.lines = 1
file_map[line].append(fi)
f.close()
return file_map
def folder_to_map(folder: str, files_map: {str, FileInfo}) -> {str, FileInfo}:
if files_map is None:
files_map = {}
files = listFiles(folder, 'lua')
for i in files:
file_to_map1(i, files_map)
return files_map
def files_to_map(files: list, files_map):
for i in files:
file_to_map1(i, files_map)
# 对比两个文件
def compareFiles(file1: str, file2: str, filename: str):
file1_map: {str, int} = {}
file_to_map1(file1, file1_map)
file2_map: {str, int} = {}
file_to_map1(file2, file2_map)
files = []
# with open(file=filename, mode='w+', encoding='utf-8') as f:
for i in file1_map.keys():
if i in file2_map.keys():
count1 = 0
for c in file1_map[i]:
count1 += c.lines
count2 = 0
for c in file2_map[i]:
count2 += c.lines
count = count2 if count1 > count2 else count1
s = 'file: %s\t\t %d\n' % (file2, count)
files.append(s)
# f.write(s)
print(s)
# f.close()
return '\n'.join(files)
class CompareItem:
lua: str
count: int
files: str
# 将 dict 转换成 列表 并排序
def map_to_list(m: dict):
fileList = []
for i in m.keys():
item = CompareItem()
item.lua = i
item.count = 0
lists = []
for c in m[i]:
item.count += c.lines
lists.append(c.to_str())
item.files = '\n'.join(lists)
fileList.append(item)
fileList.sort(key=attrgetter('count'), reverse=True)
return fileList
class smae_line:
file: str # 文件名
total: int # 总数
class same_line_item:
lua: str
folder1: str
folder2: str
# 对比两个文件夹
def compareFolders(folder1: str, folder2: str, filename: str):
folder1_map = {}
folder_to_map(folder1, folder1_map)
# folder2_map = {}
# folder_to_map(folder2, folder2_map)
fileList = map_to_list(folder1_map)
# sorted(fileList, key=attrgetter('count'), reverse=True)
folder2_map = {}
folder_to_map(folder2, folder2_map)
fileList2 = map_to_list(folder2_map)
sameList = []
with open(file=filename, mode='w+', encoding='utf-8') as f:
for i in folder2_map.keys():
if i in folder1_map.keys():
# 显示当前有多少行是相同的
count1 = 0
count2 = 0
arr1 = []
arr2 = []
for c in folder1_map[i]:
count1 += c.lines
arr1.append(c.to_str())
for d in folder2_map[i]:
count2 += d.lines
arr2.append(d.to_str())
f.write(
'%s%s 文件夹中出现 %d 次,在 %s 文件夹中出现 %d\n' % (i, folder2, count1, folder1, count2))
f.write('\n'.join(arr2))
f.write('\r\n')
f.close()
def compareFolders1(folder1: str, folder2: str, filename: str):
folder1_map = {}
folder_to_map(folder1, folder1_map)
# fileList = map_to_list(folder1_map)
folder2_map = {}
folder_to_map(folder2, folder2_map)
# fileList2 = map_to_list(folder2_map)
lists = {}
# with open(file=filename, mode='w+', encoding='utf-8') as f:
# for i in folder2_map.keys():
# if i in folder1_map.keys():
#
# f.close()
# def compareFilesWithFilename(file1, file2):
def getFileName(file: str):
if file.find('\\') != -1:
lists = file.split('\\')
return lists[len(lists) - 1]
elif file.find('/') != -1:
lists = file.split('/')
return lists[len(lists) - 1]
else:
return file
def compareFolders2(folder1: str, folder2: str, filename: str):
# 查询是否有一样的文件,如果有,那么就使用一样的文件;如果没有,那么就对比全局
files1 = listFiles(folder1, 'lua')
files2 = listFiles(folder2, 'lua')
foundFiles = []
notFoundFiles = []
for i in files2:
fn = getFileName(i)
hadFound = False
for c in files1:
if fn == getFileName(c):
foundFiles.append([i, c])
hadFound = True
break
if not hadFound:
notFoundFiles.append(i)
folder1_notFound = []
# 针对发现的文件进行处理
for i in files1:
if i not in foundFiles:
folder1_notFound.append(i)
with open(file=filename, mode='w+', encoding='utf-8') as f:
for i in foundFiles:
f.write('\n')
f.close()
notFoundLines = {}
# 将其他文件放入
# files_to_map(notFoundFiles, notFoundLines)
def compareTwoFiles(file1: str, file2: str):
# 1. 列举相同的文件
# 2. 对比相同的文件
# 比较两个文件有多少行是相同的
# 列举一个文件的所有行,然后依次对比另一个文件的所有行,如果相同 + 1不同不管他
# 3. 对于不同的文件,加入到不同文件数组中进行比较
# 该数组中,相同行数 + 1
pass
def replace_first_occurrence(text, old_word, new_word):
index = text.find(old_word)
if index != -1:
return text[:index] + new_word + text[index + len(old_word):]
else:
return text
def check_char(c, encode):
code = c.encode(encode)
print(code)
print(encode, " code = ", code.hex())