【问题标题】:Run a script for each txt file in all subfolders为所有子文件夹中的每个 txt 文件运行一个脚本
【发布时间】:2020-07-04 18:37:51
【问题描述】:

我需要为所有子文件夹中的每个 txt 文件运行以下脚本。 主文件夹是“模拟”,其中有不同的子文件夹(称为“年-月-日”)。在每个子文件夹中都有一个 txt 文件“diagno.inp”。我必须为每个“diagno.inp”文件运行此脚本,以便获得包含以下数据的列表(每天一行): “年-月-日”、“W_int”、“W_dir” 这是仅适用于子文件夹的代码。你能帮我创建一个循环吗?

fid=open('/Users/silviamassaro/weather/simulations/20180105/diagno.inp',  "r")
subfolder="20180105"
n = fid.read().splitlines()[51:]
for element in n:
    "do something" # here code to calculate W_dirand W_int for each day
     print (subfolder, W_int, W_dir)

【问题讨论】:

    标签: python recursion directory


    【解决方案1】:

    当我需要递归遍历目录及其子目录时,我通常会这样做:

    import os
    
    main_folder = '/path/to/the/main/folder'
    files_to_process = [os.path.join(main_folder, child) for child in os.listdir(main_folder)]
    
    while files_to_process:
        child = files_to_process.pop()
        if os.path.isdir(child):
            files_to_process.extend(os.path.join(child, sub_child) for sub_child in os.listdir(child))
        else:
            # We have a file here, we can do what we want with it
    

    它很短,但有相当强的假设:

    1. 您不关心文件的处理顺序。
    2. 您的入口点的子项中只有目录或常规文件。

    编辑:使用glob 添加了另一个可能的解决方案,感谢@jacques-gaudin 的评论

    此解决方案的优点是您可以确保只获得.inp 文件,但您仍然不确定它们的顺序。

    import glob
    
    main_folder = '/path/to/the/main/folder'
    files_to_process = glob.glob('%s/**/*.inp' % main_folder, recursive=Tre)
    
    for found_file in files_to_process:
        # We have a file here, we can do what we want with it
    
    

    希望这会有所帮助!

    【讨论】:

    • 为什么不使用glob?它为你做这一切不是吗? :)
    【解决方案2】:

    使用pathlib,您可以执行以下操作:

    from pathlib import Path
    
    sim_folder = Path("path/to/simulations/folder")
    
    for inp_file in sim_folder.rglob('*.inp'):
        subfolder = inp_file.parent.name
        with open(inp_file, 'r') as fid:
            n = fid.read().splitlines()[51:]
        for element in n:
            "do something" # here code to calculate W_dirand W_int for each day
            print (subfolder, W_int, W_dir)
    

    请注意,这是递归遍历所有子文件夹以查找 .inp 文件。

    【讨论】:

    • 嗨!问题是我的“模拟”文件夹中的子文件夹需要在脚本中更改,因为在每个不同的子文件夹中都有一个我必须处理的 diagno.inp 文件..
    • 我需要进入“simulations”的每个子文件夹并打开“diagno.file”。在每个子文件夹中都有一个“diagno.file”,我必须在上面工作..
    • 当然,rglob 就是这样做的。它递归地进入所有子文件夹并找到与"*.inp" 匹配的任何文件。对于每场比赛,您都将继续执行您的脚本。
    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多