【将自己写的py文件导入环境变量,方便后续import】
如果我们自己写了一个 .py 文件,是不是就可以把这个.py作为模块 import 呢?
事情远没有那么简单,必须让 Python 解释器可以找到你写的模块才可以:
比如我们在 /usr/lib 下建了一个名为 test.py 的文件,你想把它作为一个模块引入,就必须先告诉 Python 解释器我们写了这么一个文件:
import sys
sys.path.append("/usr/lib/test.py")
用上述的方式就是告诉 Python 解释器我们写的那个文件在哪里,在这个告诉的方法中也用了 import sys,不过 sys 是 Python 的标准之一,所以不需要特别告诉 Python 解释器的位置。
实战用法:
import os
import sys
from pathlib import Path
FILE = Path(__file__).resolve() # 绝对路径
ROOT = FILE.parents[0] # == FILE.parent
if str(ROOT) not in sys.path:
sys.path.append(str(ROOT)) # sys.path.append():添加相关路径,但在退出python环境后自己添加的路径就会消失
# Path.cwd():返回当前工作目录,即运行脚本所在的全局目录:/home/meng/deeplearning/yolov5/learn_test.py
ROOT = Path(os.path.relpath(ROOT, Path.cwd()))
【创建输出目录,写一个日志输出代码,用偏函数封装】
import functools
# 创建输出目录
sourcepath = r''
outpath = r''
verbose = False
data_path = Path(sourcepath) # 视频路径
output_dir = Path(outpath) # 结果输出的路径
'''
输出三个结果:
1.抽帧后的完整图片
2.对图片切片后的中心样本
3.对图片切片后对样本的聚类
'''
save_dir = output_dir / 'samples' #
save_img_path = output_dir / 'imgs'
save_seg_path = output_dir / 'segs'
# 创建文件夹
'''
大图片跟样本图片是肯定要的
切片图片根据参数,参数需要切片再创建目录
'''
save_dir.mkdir(parents=True, exist_ok=True)
save_img_path.mkdir(parents=True, exist_ok=True)
if verbose:
save_seg_path.mkdir(parents=True, exist_ok=True)
# 写偏函数封装日志,方c便查找问题。输出路径:原输出路径/logs
# 先写个日志的输出方法
# 输出是消息,路径,文件名和是否打印日志
def logger_(mess, file_path='./mds_logs/', file_name='video0', printlog=False):
if printlog:
print('\n' + mess + '\n')
# 时间格式
mess = time.strftime('%m-%d,%H:%M:%S', time.localtime(time.time())) + '||' + mess + '\n'
time_mark = datetime.datetime.now().strftime('%Y-%m-%d %H')
error_file_mark = '%s_%s.txt' % (file_name, time_mark)
error_file_path = os.path.join(file_path, error_file_mark)
if not os.path.exists(file_path):
os.makedirs(file_path)
if not os.path.exists(error_file_path):
with open(error_file_path, mode='w', encoding='utf-8') as f:
f.writelines(mess)
else:
with open(error_file_path, mode='a', encoding='utf-8') as f:
f.writelines(mess)
logger = functools.partial(logger_, file_path=str(output_dir / 'logs'),
file_name='mds')
【不确定视频格式,先转换视频格式】
# 不确定视频格式,先转换视频格式
# 输入参数为视频路径,和待转换的类型
def convert_videos(data_path, convert_type='MOV'):
v_file_lst = os.listdir(data_path) # 先获取文件夹下
# 写个正则,规则为全部后缀为'mov' 的文件
regex = re.compile(".*.(%s)" % convert_type)
# lambda函数过滤正则
v_names = list(filter(lambda x: regex.match(x) and x[0] != '.', v_file_lst))
# 对符合条件的视频做转换
if len(v_names) > 0:
# 设置一个进度条
vpbar = tqdm(enumerate(v_names), total=len(v_names), bar_format='{l_bar}{bar:10}{r_bar}{bar:-10b}')
# 使用cmd转换
for i, vname in vpbar:
# 设置进度条信息
vpbar.set_description("Convert to mp4")
vpbar.set_postfix(video=vname)
vpath = str(data_path / vname)
save_name = vname.split('.')[0] + '.mp4'
save_path = str(data_path / save_name)
# 设置cmd命令
cmd = [
"ffmpeg",
"-i", vpath,
"-vcodec", "copy",
"-f", "mp4"
"-loglevel", "error"
save_path
]
# 调用cmd命令行
subprocess.call(cmd)
# 对转换完的文件做一次正则再排序
v_file_lst = os.listdir(data_path)
regex = re.compile(".*.(mp4)")
v_names = list(filter(lambda x: regex.match(x) and x[0] != '.', v_file_lst))
v_names = sorted(v_names)
# 返回排好序的文件名列表
# 调用转换函数
# convert = 这里设置待转换的后缀
v_names = convert_videos(data_path, convert_type=convert)
video_num = len(v_names)