Python:仅将那些在命令行参数中给定的文件名范围内的.avi文件从一个目录复制到另一个目录

2024-06-11 19:32:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有不同的目录,其中包含给定格式的.avi文件:

2021-03-06
---17 15 33.avi
   17 16 33.avi
   17 17 33.avi

2021-03-07
---19 43 57.avi
   19 44 57.avi
   19 45 57.avi

Retrieval

用户将指定要从中复制文件的目录名、开始文件名和结束文件名作为参数。例如:

python copy.py -f "2021-03-07" -s "19 43 57" -e "19 44 57"

运行此操作后,应在检索内部创建一个新的子目录,该子目录将与开始文件名相同,其中应复制.avi文件

预期结果:

2021-03-06
---17 15 33.avi
   17 16 33.avi
   17 17 33.avi

2021-03-07
---19 43 57.avi
   19 44 57.avi
   19 45 57.avi

Retrieval
---19 43 57
   ---19 43 57.avi
      19 44 57.avi

[注意:仅复制起始和结束文件名内的视频,包括给定的文件名]

这是迄今为止我能够编写的脚本:

import os
import shutil
import glob
import argparse
from pprint import pprint 



ap = argparse.ArgumentParser()

ap.add_argument("-d","--startTime",  type=str, required=True,
                help="Start time of video")
ap.add_argument("-r","--endTime",  type=str, required=True,
                help="End time of video")
ap.add_argument("-f","--folder",  type=str, required=True,
                help="Folder name for which videos are to be merged")

args = ap.parse_args()

source='drive://'+args.folder+'//'
dest='drive://Retrieval//'+args.startTime+'//'
files = []
for dirname, dirnames, filenames in os.walk(source):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        files.append(os.path.join(dirname, subdirname))

    # print path to all filenames.
    for filename in filenames:
        files.append(os.path.join(dirname, filename))
pprint(files)

if os.path.exists(dest):
    print("this folder exit in this dir")
else:
    dir = os.mkdir(dest)
    for f in files:
        shutil.copy(f,dest)
        print("done")

上述代码的问题在于它将所有文件从源文件夹复制到目标文件夹


Tags: 文件pathinimportforos文件名args
1条回答
网友
1楼 · 发布于 2024-06-11 19:32:36

要对文件执行模式搜索,可以使用^{}。在上面的示例中,对于所有具有文件路径的操作,我都使用了^{},其中^{}提供了pathlibglob之间的接口

所以,要从文件夹中检索所有需要的文件,我们可以使用下一个模式:[0-9][0-9] [0-9][0-9] [0-9][0-9].avi。它将匹配所有.avi文件,其中名称将包含3个由空格分隔的2位数字

您的文件名包含时间,我建议您使用^{}^{}startTime/endTime参数和文件名转换为相应的时间结构,我们将更容易进行比较

此外,我还在代码中添加了一些基本数据验证和消息,以下是最终结果:

from argparse import ArgumentParser
from pathlib import Path
from time import strptime
from shutil import copy2

ap = ArgumentParser()

ap.add_argument("-s", " startTime",  type=str, required=True,
                help="File name with Start time of video")
ap.add_argument("-e", " endTime",  type=str, required=True,
                help="File name with End time of video")
ap.add_argument("-f", " folder",  type=str, required=True,
                help="Folder name for which videos are to be merged")

args = ap.parse_args()

root_path = Path(r"drive://")
filename_format = "[0-9][0-9] [0-9][0-9] [0-9][0-9].avi"
time_format = "%H %M %S"

src_path = root_path / args.folder
dst_path = root_path / "Retrieval" / args.startTime

# source folder validation
if not src_path.is_dir():
    raise FileNotFoundError("Provided folder doesn't exist")
# destination folder vaidation
try:
    dst_path.mkdir(parents=True, exist_ok=True)
except OSError:
    raise ValueError("Can't create folder:", dst_path)
# start/end time validation
try:
    min_time = strptime(args.startTime, time_format)
    max_time = strptime(args.endTime, time_format)
except ValueError:
    raise ValueError("Invalid start/end time")

for file in src_path.glob(filename_format):
    try:
        parsed_time = strptime(file.stem, time_format)
    except ValueError:
        print("Skipped:", file)
    else:
        if min_time <= parsed_time <= max_time:
            copy2(file, dst_path / file.name)
            print("Copied:", file)
        else:
            print("Skipped:", file)

相关问题 更多 >