136 lines
4.3 KiB
Python
136 lines
4.3 KiB
Python
def deduplicate(src_file, dest_file):
|
||
lines_seen = set()
|
||
output_lines = []
|
||
|
||
with open(src_file, "r", encoding="utf-8") as file:
|
||
for line in file:
|
||
stripped_line = line.strip()
|
||
if (
|
||
stripped_line == ""
|
||
or stripped_line.startswith("#")
|
||
or stripped_line not in lines_seen
|
||
):
|
||
output_lines.append(line)
|
||
if stripped_line != "":
|
||
lines_seen.add(stripped_line)
|
||
|
||
with open(dest_file, "w", encoding="utf-8", newline="\n") as file:
|
||
file.writelines(output_lines)
|
||
|
||
|
||
def get_info(src_file):
|
||
with open(src_file, "r", encoding="utf-8") as f:
|
||
lines = f.readlines()
|
||
|
||
info = []
|
||
flag_continue = False
|
||
|
||
for line in lines:
|
||
if line == "\n" or line.startswith("#"):
|
||
info.append(line)
|
||
elif line == "---\n":
|
||
info.append(line)
|
||
flag_continue = True
|
||
elif flag_continue:
|
||
info.append(line)
|
||
if line == "...\n":
|
||
flag_continue = False
|
||
else:
|
||
break
|
||
|
||
return info
|
||
|
||
|
||
def sort(src_file, dest_file):
|
||
info = get_info(src_file)
|
||
|
||
# 跳过处理 THUOCL 词库
|
||
if "thuocl" in src_file:
|
||
return
|
||
|
||
with open(src_file, "r", encoding="utf-8") as f:
|
||
lines = f.readlines()[len(info) :]
|
||
|
||
format_type = len(lines[0].split("\t"))
|
||
|
||
# format_type == 2 时,排序「字 zi」此类,规则是按拼音排序
|
||
# format_type == 3 时,排序「字 zi 1」此类,规则是按拼音+字频排序
|
||
# 暂时不支持混排
|
||
if format_type == 2:
|
||
wait_to_write = []
|
||
part_to_sort = []
|
||
|
||
for line in lines:
|
||
if line.startswith("#") or line == "\n":
|
||
if part_to_sort:
|
||
sorted_lines = sorted(
|
||
part_to_sort,
|
||
key=lambda x: x.split("\t")[1]
|
||
if len(x.split("\t")) > 1
|
||
else "",
|
||
)
|
||
wait_to_write += sorted_lines
|
||
part_to_sort.clear()
|
||
wait_to_write.append(line)
|
||
continue
|
||
part_to_sort.append(line)
|
||
|
||
if part_to_sort:
|
||
wait_to_write += sorted(
|
||
part_to_sort,
|
||
key=lambda x: x.split("\t")[1] if len(x.split("\t")) > 1 else "",
|
||
)
|
||
with open(dest_file, "w", encoding="utf-8", newline="\n") as f:
|
||
f.writelines(info + wait_to_write)
|
||
elif format_type == 3:
|
||
wait_to_write = []
|
||
part_to_sort = []
|
||
|
||
for line in lines:
|
||
if line.startswith("#") or line == "\n":
|
||
if part_to_sort:
|
||
sorted_lines = sorted(
|
||
part_to_sort,
|
||
key=lambda x: (
|
||
x.split("\t")[1] if len(x.split("\t")) > 1 else "",
|
||
int(x.split("\t")[2])
|
||
if len(x.split("\t")) > 2 and x.split("\t")[2].isdigit()
|
||
else 0,
|
||
),
|
||
)
|
||
wait_to_write += sorted_lines
|
||
part_to_sort.clear()
|
||
wait_to_write.append(line)
|
||
continue
|
||
part_to_sort.append(line)
|
||
|
||
if part_to_sort:
|
||
wait_to_write += sorted(
|
||
part_to_sort,
|
||
key=lambda x: (
|
||
x.split("\t")[1] if len(x.split("\t")) > 1 else "",
|
||
int(x.split("\t")[2])
|
||
if len(x.split("\t")) > 2 and x.split("\t")[2].isdigit()
|
||
else 0,
|
||
),
|
||
)
|
||
with open(dest_file, "w", encoding="utf-8", newline="\n") as f:
|
||
f.writelines(info + wait_to_write)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
import os
|
||
import sys
|
||
|
||
dicts_dir = os.path.join(os.path.abspath(os.path.dirname(sys.path[0])), "dicts")
|
||
|
||
for root, _, files in os.walk(dicts_dir):
|
||
for file in files:
|
||
if file.endswith(".yaml"):
|
||
file_path = os.path.join(root, file)
|
||
print(f"Processing {file_path}")
|
||
deduplicate(file_path, file_path)
|
||
sort(file_path, file_path)
|
||
|
||
print("Processing completed")
|