微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有不同的目录,其中包含给定格式的 .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"

运行后,应在 Retrieval 中创建一个新的子目录,该子目录与起始文件名相同,.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",help="End time of video")
ap.add_argument("-f","--folder",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")

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

解决方法

要对文件执行模式搜索,您可以使用 glob。在上面的示例中,我使用了 pathlibPath.glob() 提供了 pathlibglob 之间的接口。

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

您的文件名包含时间,我建议您使用 time.strptime()datetime.strptime()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",help="File name with End time of video")
ap.add_argument("-f","--folder",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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。