【问题标题】:For else with list, and folder transfer对于带有列表和文件夹传输的其他内容
【发布时间】:2020-10-05 02:32:06
【问题描述】:

我在一个子文件夹中有多个文件需要复制到另一个具有指定子文件夹名称和日期时间的主文件夹,意味着 A1/B/C/D/D.txt 复制到 A2 /B/C/D/datetime_username/D.txt,目录B,C,D可能B1,B2中有多个文件夹......用户决定要传输哪个子文件夹

现在我正在尝试使用基本的东西来打印 D 文件夹的路径。我正在尝试的文件夹在我的桌面上。


    import os, shutil
    
    os.chdir('C:\\path')
    
    def main():
        lvl1 = ['Typ','GFP2']
        lvl2 = ['A0','A1']
        lvl3 = ['SCAN','MBIST']
    
        project = input("Enter project: ")
        
        #Validation
        for s in lvl1:
    
            if s == project:
                src1 = 'IDC\\{}'.format(s)
                
                stepping = input("Enter Stepping: ")
                
                for l2 in lvl2:
                    if l2 == stepping:
                        #shutil.copytree()
                        src2 = src1+'\\{}'.format(l2)
    
                        thirdlvl = input("Enter SCAN/MBIST: ")
    
                        for l3 in lvl3:
                            if l3 == thirdlvl:
                                src3 = src2+'\\{}'.format(l3)
                                print(src3)
                            
    
                else:
                    print("Stepping not found")
                    break
    
        else:
            print("Project name not found")
        
        
    main()

我会得到 '''

Enter project: Typ
Enter Stepping: A0
Enter SCAN/MBIST: SCAN
IDC\Typ\A0\SCAN
Stepping not found

'''

如果我只想在没有找到步进时打印“未找到步进”,现在即使存在此文件夹也会打印。

谢谢

【问题讨论】:

  • 只有在for循环中有“break”时才会执行“else”。如果发现步进并在循环后检查它,也许您应该添加一个标志变量来设置 true。

标签: python list file for-loop


【解决方案1】:

您需要在您的for-else 中添加(或更改其位置)break。最小的修改是:

def main():
    lvl1 = ['Typ','GFP2']
    lvl2 = ['A0','A1']
    lvl3 = ['SCAN','MBIST']

    project = input("Enter project: ")
    
    #Validation
    for s in lvl1:

        if s == project:
            src1 = 'IDC\\{}'.format(s)
            
            stepping = input("Enter Stepping: ")
            
            for l2 in lvl2:
                if l2 == stepping:
                    #shutil.copytree()
                    src2 = src1+'\\{}'.format(l2)

                    thirdlvl = input("Enter SCAN/MBIST: ")

                    for l3 in lvl3:
                        if l3 == thirdlvl:
                            src3 = src2+'\\{}'.format(l3)
                            print(src3)
                    break
            else:
                print("Stepping not found")
                
            break
    else:
        print("Project name not found")

你也可以通过

摆脱for-loop
def main():
    lvl1 = ['Typ','GFP2']
    lvl2 = ['A0','A1']
    lvl3 = ['SCAN','MBIST']

    project = input("Enter project: ")

    #Validation
    if project in lvl1:
        src1 = 'IDC\\{}'.format(project)
        
        stepping = input("Enter Stepping: ")
        
        if stepping in lvl2:
            #shutil.copytree()
            src2 = src1+'\\{}'.format(stepping)

            thirdlvl = input("Enter SCAN/MBIST: ")

            if thirdlvl in lvl3:
                src3 = src2+'\\{}'.format(thirdlvl)
                print(src3)
        else:
            print("Stepping not found")
    else:
        print("Project name not found")

不需要多层if-else 结构。这是一个修改。我还使用了os.path.join(),它比字符串操作更适合处理路径:

import os, shutil

working_dir = os.path.join("C:/", "path")
os.chdir(working_dir)

def main():
    lvl1 = ['Typ','GFP2']
    lvl2 = ['A0','A1']
    # lvl3 = ['SCAN','MBIST']
    
    project = input("Enter project: ")
    if project not in lvl1:
        print("Project name not found")
        return
    
    stepping = input("Enter Stepping: ")
    if stepping not in lvl2:
        print("Stepping not found")
        return

    thirdlvl = input("Enter SCAN/MBIST: ")
    
    src = os.path.join(project, stepping, thirdlvl)
    print("src", src)
    
    if not os.path.exists(src):
        print("Src not exists")

main()

您甚至可以通过让os.listdir() 为您列出所有子文件夹来进一步自动化该过程。

import os, shutil

working_dir = os.path.join("C:/", "path")
os.chdir(working_dir)

def main():    
    project = input("Enter project: ")
    lvl1 = os.listdir(working_dir) # list all the directories under the working directory.
    if project not in lvl1:
        print("Project name not found")
        return # if you want to exit when not finding the project folder.
    
    stepping = input("Enter Stepping: ") # list all the directories under the project directory.
    lvl2 = os.listdir(os.path.join(working_dir, project))
    if stepping not in lvl2:
        print("Stepping not found")
        return # if you want to exit when not finding the stepping folder.
        
    thirdlvl = input("Enter SCAN/MBIST: ")
    
    src = os.path.join(project, stepping, thirdlvl)
    print("src", src)
    
    if not os.path.exists(src):
        print("Src not exists")

main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多