84 lines
3.9 KiB
Python
84 lines
3.9 KiB
Python
import re
|
||
import os
|
||
|
||
def split_log_file(source_folder: str, output_folder: str) -> list:
|
||
"""
|
||
扫描源文件夹中的所有.txt聊天记录,将它们按天合并,并在每条记录前标注来源群组。
|
||
|
||
此函数会先清空旧的拆分文件,以确保报告的实时性。
|
||
|
||
:param source_folder: 存放原始聊天记录的文件夹路径 (例如: 'uploads')。
|
||
:param output_folder: 存放按天合并后文件的文件夹路径 (例如: '聊天记录_按天拆分')。
|
||
:return: 一个包含所有被写入的每日合并文件路径的列表。
|
||
"""
|
||
if not os.path.exists(source_folder):
|
||
print(f"错误: 源文件夹未找到 -> {source_folder}")
|
||
return []
|
||
|
||
if not os.path.exists(output_folder):
|
||
os.makedirs(output_folder)
|
||
print(f"已创建输出文件夹: {output_folder}")
|
||
|
||
# **第一步:先清空所有旧的每日日志文件,确保数据是全新的**
|
||
for f_name in os.listdir(output_folder):
|
||
if re.match(r"^\d{4}-\d{2}-\d{2}\.txt$", f_name):
|
||
try:
|
||
os.remove(os.path.join(output_folder, f_name))
|
||
except OSError as e:
|
||
print(f"警告:无法删除旧的日志文件 {f_name}。错误: {e}")
|
||
print("已清空旧的每日合并日志。")
|
||
|
||
date_pattern = re.compile(r"^(\d{4}-\d{2}-\d{2}) \d{2}:\d{2}:\d{2}")
|
||
|
||
# 用一个字典来管理所有按天拆分的输出文件句柄,避免频繁开关文件
|
||
output_files = {}
|
||
# 用一个集合来存储本次运行实际写入过的文件路径
|
||
written_files = set()
|
||
|
||
try:
|
||
source_file_names = [f for f in os.listdir(source_folder) if f.endswith('.txt')]
|
||
if not source_file_names:
|
||
print(f"警告: 源文件夹 '{source_folder}' 中未发现 .txt 文件。")
|
||
return []
|
||
|
||
# **第二步:遍历所有源文件并处理**
|
||
for filename in source_file_names:
|
||
source_file_path = os.path.join(source_folder, filename)
|
||
# 从文件名提取群名,作为来源标签
|
||
group_name = os.path.splitext(filename)[0]
|
||
source_tag = f"[来自: {group_name}] "
|
||
# 记录当前文件最后一次匹配到的日期所对应的输出文件句柄
|
||
current_day_output_file = None
|
||
|
||
with open(source_file_path, 'r', encoding='utf-8') as f_in:
|
||
for line in f_in:
|
||
# 忽略空行
|
||
if not line.strip():
|
||
continue
|
||
|
||
match = date_pattern.match(line)
|
||
if match:
|
||
date_str = match.group(1)
|
||
|
||
# 如果需要切换到新的日期文件
|
||
if date_str not in output_files:
|
||
output_filename = os.path.join(output_folder, f"{date_str}.txt")
|
||
# 因为已清空旧文件,这里统一使用安全追加模式
|
||
output_files[date_str] = open(output_filename, 'a', encoding='utf-8')
|
||
written_files.add(output_filename)
|
||
|
||
# 更新当前行应该写入的文件
|
||
current_day_output_file = output_files[date_str]
|
||
|
||
# 如果当前行已经有了归属文件 (无论是新找到的还是继承上一行的)
|
||
# 这可以确保多行消息也能被正确地打上标签并写入
|
||
if current_day_output_file:
|
||
current_day_output_file.write(source_tag + line)
|
||
finally:
|
||
# **第三步:操作结束后,关闭所有打开的文件,释放资源**
|
||
for f in output_files.values():
|
||
f.close()
|
||
|
||
print(f"日志合并与拆分完成。共处理 {len(source_file_names)} 个源文件,写入了 {len(written_files)} 个每日日志。")
|
||
return list(written_files)
|