411 lines
9.6 KiB
Python
411 lines
9.6 KiB
Python
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())
|