繁体   English   中英

使用python脚本将一个文件夹中的多个jpeg文件和json文件复制并排序到子文件夹文件夹中的另一个文件夹

[英]copy and sort multiple jpeg files and json files in one folder to another folder in subfolders folder using python script

我有大文件集

965_0000000005_0000000001_20211105153826.json
965_0000000005_0000000001_20211105153826.jpg
965_0000000005_0000000002_20211105153826.json
965_0000000005_0000000002_20211105153826.jpg
965_0000000005_0000000003_20211105153826.json
965_0000000005_0000000003_20211105153826.json
 .
 .
 .
965_0000000005_0000000010_20211105153826.json
965_0000000005_0000000010_20211105153826.jpg
965_0000000006_0000000001_20211105153826.json
965_0000000006_0000000001_20211105153826.json
965_0000000007_0000000001_20211105153826.jpg
965_0000000007_0000000001_20211105153826.json
965_0000000008_0000000001_20211105153826.jpg
965_0000000008_0000000001_20211105153826.json
965_0000000009_0000000001_20211105153826.json
965_0000000009_0000000002_20211105153826.jpg
965_0000000010_0000000002_20211105153826.json
965_0000000010_0000000003_20211105153826.jpg
965_0000000011_0000000001_20211105153826.json
965_0000000011_0000000001_20211105153826.jpg
965_0000000011_0000000002_20211105153826.json
965_0000000011_0000000002_20211105153826.jpg
............
965_0000000011_0000000010_20211105153826.json
965_0000000011_0000000010_20211105153826.jpg

一起想通过提供输入来复制和排序它们

Enter product numbers:965-1000;100-110; 71

output :
965...jpeg file ok copied
965...json file ok copied
...
71 file doesnt exit.
     
for sort the file in the folder like 
    20220627
    if 20220627_XXXX_NG_2_anomaly else 20220627_XXXX_OK_2_nomaly 
        gray_images -jpeg files
        5_0000000001_
        5_0000000002_
        5_0000000003_
        5_0000000004_

        5_0000000010_
        Json -json files
        5_0000000001_
        5_0000000002_
        5_0000000003_
        5_0000000004_

        5_0000000010_
 
    if20220627_XXXX_NG_3_anomaly
    else20220627_XXXX_OK_3_nomaly
        gray_images -jpeg files
        6_0000000001_
        7_0000000001_
        8_0000000001_
        9_0000000001_
        10_0000000001_
        Json -json files
        6_0000000001_
        7_0000000001_
        8_0000000001_
        9_0000000001_
        10_0000000001_
    if 20220627_XXXX_NG_4_anomaly else 220220627_XXXX_OK_4_nomaly
        gray_images -jpeg files
        11_000000001_
        .
        .
         11_0000000010_
        Json -json files
        11_000000001_
        .
        .
         11_0000000010_

一个产品 25 (10-5-10) jpeg 文件。 json 文件依赖于注解。 我被困在排序文件中。 请帮我编程。

将文件分隔到特定子目录的一种简单方法是使用os.path库并逐步创建子目录,直到您到达可以根据文件扩展名复制文件的基础。

例如:

def output_path(filename, status, product, outpaths):
    today = "".join(str(date.today()).split("-"))
    parts = filename.split("_")
    if parts[1] in outpaths:
        num = outpaths[parts[1]]
    else:
        num = "3"
        outpaths[parts[1]] = num
    if status == "0":
        status = "anomaly"
    else:
        status = "nomaly"
    subdir = "_".join([today, product, str(num), status])
    if os.path.splitext(filename)[1].lower() == ".json":
        path = os.path.join(today, subdir, "json")
    else:
        path = os.path.join(today, subdir, "grey_images")
    if not os.path.exists(path):
        os.makedirs(path)
    return os.path.join(path,filename)

如果您仍在使用与上次相同的程序,您可以像这样集成它。

import os
import shutil
from datetime import date

def gen_range(text):
    start, end = [int(i) for i in text.split("-")]
    return list(range(start,end))

def get_user_input():
    nums = input("Enter search values - example: (123;135;561-568;12)\n")
    if ";" in nums:
        values = []
        for value in [i for i in nums.split(';')]:
            if "-" in value:
                values += gen_range(value)
            else:
                values.append(value)
    elif nums.isdigit():
        values = [int(nums)]
    elif "-" in nums:
        values = gen_range(nums)
    else:
        raise ValueError
    return list(map(str,values))

def get_input_values():
    while True:
        nums = get_user_input()
        product = input("Enter product name: ")
        status = input("Enter the product status\nEnter 0 for OK\nEnter 1 for NG\nEnter other for others\n")
        d = {"numbers": nums, "status": status, "product": product}
        print(d)
        correct = input("Is the above information correct? yes/no: ")
        if correct == "yes":
            return d

def output_path(filename, status, product, outpaths):
    today = "".join(str(date.today()).split("-"))
    parts = filename.split("_")
    if parts[1] in outpaths:
        num = outpaths[parts[1]]
    else:
        num = "3"
        outpaths[parts[1]] = num
    if status == "0":
        status = "anomaly"
    else:
        status = "nomaly"
    subdir = "_".join([today, product, str(num), status])
    if os.path.splitext(filename)[1].lower() == ".json":
        path = os.path.join(today, subdir, "json")
    else:
        path = os.path.join(today, subdir, "grey_images")
    if not os.path.exists(path):
        os.makedirs(path)
    return os.path.join(path,filename)

def copyfiles(numbers=None, status=None, product=None):
    unused = numbers[:]
    data = os.walk(os.path.normcase('./'))
    outpaths = {"0000000005": "2", "0000000011": "4"}
    for root, _, files in data:
        for filename in files:
            part = filename.split('_')[0]
            name, ext = os.path.splitext(filename)
            if part in numbers and ext.lower() in [".json",".jpeg",".jpg"]:
                if part in unused:
                    unused.remove(part)
                origin = os.path.join(root, filename)
                dest = output_path(filename, status, product, outpaths)
                try:
                    shutil.copyfile(origin, dest)
                    print(f"OK==>No {filename} has been copied.")
                except:
                    print(f"NG==>No {part} failed to copy")
    for number in unused:
        print(f"NG==>No {number} does not exist")



if __name__ == "__main__":
    params = get_input_values()
    copyfiles(**params)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM