【问题标题】:How to look for file in all subdirectories and copy it?如何在所有子目录中查找文件并复制它?
【发布时间】:2021-02-16 08:55:15
【问题描述】:

我需要一个批处理程序,它在运行后可以像这样工作:

  1. 我在批处理窗口中输入了一个数字
  2. 它会在C:/Print/ 中查找名为类似输入但扩展名为.tif 的文件
  3. 如果文件不在C:/Print/ 中,那么它应该在所有子目录中查找该文件,例如C:/Print/64326/BCB/1234.tif
  4. 找到文件后应该复制到D:/HotFolder/

我设法创造了这样的东西,但首先它不能正常工作,第二件事是它不是通用的。

import os, glob, time, shutil
os.chdir("C:/Print")
print("Scan the barcode.")
while True:
    barcode = input(">").upper()
    tif = f"{barcode}.tif"
    if os.path.isfile(tif):
        shutil.copy(tif, "D:/HotFolder//")
        print(f"File copied succesfully. {tif}")
        os.chdir("C:/Print/")
    elif not os.path.isfile(barcode):
        os.chdir(f"C:/Print/{barcode}")
        if os.path.isfile(tif):
            shutil.copy(tif, "D:/HotFolder/")
            print(f"File copied succesfully. {tif}")
            os.chdir("C:/Print/")
        elif not os.path.isfile(tif):
            os.chdir(f"C:/Print/{barcode}/FCB")
            if os.path.isfile(barcode):
                shutil.copy(tif, "D:/HotFolder/")
                print(f"File copied succesfully. {tif}")
                os.chdir("C:/Print/")
            elif not os.path.isfile(tif):
                os.chdir(f"C:/Print/{barcode}/FCS")
                if os.path.isfile(barcode):
                    shutil.copy(tif, "D:/HotFolder/")
                    print(f"File copied succesfully. {tif}")
                    os.chdir("C:/Print/")
                elif not os.path.isfile(tif):
                    os.chdir(f"C:/Print/{barcode}/BCB")
                    if os.path.isfile(barcode):
                        shutil.copy(tif, "D:/HotFolder/")
                        print(f"File copied succesfully. {tif}")
                        os.chdir("C:/Print/")
                    elif not os.path.isfile(tif):
                        os.chdir(f"C:/Print/{barcode}/BCS")
                        if os.path.isfile(barcode):
                            shutil.copy(tif, "D:/HotFolder/")
                            print(f"File copied succesfully. {tif}")
                            os.chdir("C:/Print/")
    else:
        print("Error.")

【问题讨论】:

    标签: python loops copy subdirectory


    【解决方案1】:

    这是基于使用 os.walk() 函数的原始答案的完全修订版本。它现在使用来自pathlib 模块的Path 子类——这使得它几乎与@Andrei's answer 相同。

    主要区别在于我在评论中加入了您在下面要求的附加功能。

    from pathlib import Path
    import shutil
    
    root_dir = Path('C:/Print')
    target_dir = Path('D:/HotFolder')
    ext = '.tif'
    
    while True:
        target_filename = (input("Barcode? ") + ext).casefold()
    
        for filename in root_dir.rglob('*' + ext):
            if filename.name.casefold() == target_filename:
                shutil.copy2(filename, target_dir)
                print(f'{filename.name} copied from {filename.parent} to {target_dir}')
                break  # Target found and copied.
        else:
            print(f'{target_filename} not found in {root_dir} directory')
    

    【讨论】:

    • 这很有帮助。你能帮我再添加两件事吗?我需要在开头添加一个功能,例如“while True:”,这样程序一直保持打开状态,我可以输入多个条形码,并且程序在我手动关闭之前不会停止?此外,它是否可以查找名为“52TgFsHH.tif”但输入为小写的文件?基本上它应该忽略字母的大小写。
    【解决方案2】:

    这是一个小sn-p:

    from pathlib import Path
    from shutil import copyfile
    
    input_dir = "C:/Print/"
    output_dir = "D:/HotFolder/"
    
    barcode = "1234"
    
    for filename in Path(input_dir).rglob("*.tif"):
        if filename.name == barcode + ".tif":
            copyfile(filename, Path(output_dir, filename.name))
            break
    else:
        print("Not found")
    

    【讨论】:

    • 实际上,我注意到了一件事。如果文件名包含字母则不起作用。 “123hb”不起作用或“testfile”不起作用。有什么解决办法吗?
    • 文件名是否相同?
    • 是的。名称大小写相同。
    猜你喜欢
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多