136 lines
5.0 KiB
Python
136 lines
5.0 KiB
Python
|
|
import os
|
|||
|
|
import tarfile
|
|||
|
|
import shutil
|
|||
|
|
import stat
|
|||
|
|
|
|||
|
|
def get_project_root():
|
|||
|
|
current_file = os.path.abspath(__file__)
|
|||
|
|
project_root = os.path.dirname(os.path.dirname(current_file))
|
|||
|
|
return project_root
|
|||
|
|
|
|||
|
|
def unzip_log(tar_path, extract_path='.'):
|
|||
|
|
"""
|
|||
|
|
解压 tar.gz 文件到指定目录
|
|||
|
|
|
|||
|
|
参数:
|
|||
|
|
tar_path (str): tar.gz 文件的路径
|
|||
|
|
extract_path (str): 解压目标目录,默认为当前目录
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
# 检查文件是否存在
|
|||
|
|
if not os.path.exists(tar_path):
|
|||
|
|
raise FileNotFoundError(f"文件不存在: {tar_path}")
|
|||
|
|
|
|||
|
|
# 创建解压目录(如果不存在)
|
|||
|
|
os.makedirs(extract_path, exist_ok=True)
|
|||
|
|
|
|||
|
|
# 打开 tar.gz 文件并解压
|
|||
|
|
with tarfile.open(tar_path, "r:gz") as tar:
|
|||
|
|
# 列出所有文件(可选)
|
|||
|
|
print(f"解压文件列表:")
|
|||
|
|
for member in tar.getmembers():
|
|||
|
|
print(f"- {member.name}")
|
|||
|
|
|
|||
|
|
# 解压所有文件到目标目录
|
|||
|
|
tar.extractall(path=extract_path)
|
|||
|
|
print(f"\n成功解压到: {os.path.abspath(extract_path)}")
|
|||
|
|
|
|||
|
|
except tarfile.TarError as e:
|
|||
|
|
print(f"tar 文件处理错误: {e}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"解压失败: {e}")
|
|||
|
|
|
|||
|
|
def remove_readonly(func, path, excinfo):
|
|||
|
|
"""用于处理删除只读文件的错误回调函数"""
|
|||
|
|
# 尝试修改文件权限
|
|||
|
|
os.chmod(path, stat.S_IWRITE)
|
|||
|
|
# 再次尝试删除
|
|||
|
|
func(path)
|
|||
|
|
|
|||
|
|
def clean_log_data(path):
|
|||
|
|
"""删除目录,处理权限问题"""
|
|||
|
|
if not os.path.exists(path):
|
|||
|
|
print(f"目录不存在: {path}")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# 方法1: 使用onerror回调处理权限问题
|
|||
|
|
shutil.rmtree(path, onerror=remove_readonly)
|
|||
|
|
print(f"成功删除目录: {path}")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"删除目录时出错: {e}")
|
|||
|
|
# 方法2: 先递归修改权限再删除(备选方案)
|
|||
|
|
try:
|
|||
|
|
# 递归修改目录权限
|
|||
|
|
for root, dirs, files in os.walk(path):
|
|||
|
|
for dir in dirs:
|
|||
|
|
dir_path = os.path.join(root, dir)
|
|||
|
|
os.chmod(dir_path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
|
|||
|
|
for file in files:
|
|||
|
|
file_path = os.path.join(root, file)
|
|||
|
|
os.chmod(file_path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
|
|||
|
|
|
|||
|
|
# 修改权限后再次尝试删除
|
|||
|
|
shutil.rmtree(path)
|
|||
|
|
print(f"通过修改权限成功删除目录: {path}")
|
|||
|
|
except Exception as e2:
|
|||
|
|
print(f"修改权限后仍无法删除目录: {e2}")
|
|||
|
|
|
|||
|
|
def read_specific_line(file_path, line_number):
|
|||
|
|
"""
|
|||
|
|
读取文件中指定行的内容(行号从1开始)
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
with open(file_path, 'r', encoding='utf-8') as file:
|
|||
|
|
for current_line, content in enumerate(file, 1): # 从1开始计数
|
|||
|
|
if current_line == line_number:
|
|||
|
|
return content.strip() # strip() 去除换行符和空格
|
|||
|
|
# 若行号超出文件总行数,返回None
|
|||
|
|
return None
|
|||
|
|
except FileNotFoundError:
|
|||
|
|
print(f"错误:文件 '{file_path}' 不存在")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
def append_to_file(file_path, content):
|
|||
|
|
"""
|
|||
|
|
以追加模式将字符串写入文件
|
|||
|
|
|
|||
|
|
参数:
|
|||
|
|
file_path (str): 文件路径
|
|||
|
|
content (str): 要写入的字符串内容
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
# 打开文件,模式为 'a'(追加),编码指定为 utf-8 以支持中文
|
|||
|
|
with open(file_path, 'a', encoding='utf-8') as file:
|
|||
|
|
# 写入内容(可根据需要添加换行符 '\n')
|
|||
|
|
file.write(content + '\n') # 加 '\n' 使每次写入占一行
|
|||
|
|
print(f"内容已成功追加到文件:{file_path}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"写入文件失败:{str(e)}")
|
|||
|
|
|
|||
|
|
def read_file_to_string(file_path):
|
|||
|
|
"""
|
|||
|
|
打开文件并将全部内容读取到一个字符串中
|
|||
|
|
|
|||
|
|
参数:
|
|||
|
|
file_path (str): 要读取的文件路径
|
|||
|
|
返回:
|
|||
|
|
str: 文件内容字符串;若读取失败则返回 None
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
# 使用 with 语句打开文件(自动处理关闭)
|
|||
|
|
# 'r' 表示只读模式,encoding='utf-8' 确保中文正常读取
|
|||
|
|
with open(file_path, 'r', encoding='utf-8') as file:
|
|||
|
|
# read() 方法读取全部内容并返回字符串
|
|||
|
|
content = file.read()
|
|||
|
|
return content
|
|||
|
|
except FileNotFoundError:
|
|||
|
|
print(f"错误:文件 '{file_path}' 不存在")
|
|||
|
|
except PermissionError:
|
|||
|
|
print(f"错误:没有权限读取文件 '{file_path}'")
|
|||
|
|
except UnicodeDecodeError:
|
|||
|
|
print(f"错误:文件 '{file_path}' 不是 UTF-8 编码,无法读取")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"读取文件失败:{str(e)}")
|
|||
|
|
return None
|