【问题标题】:How to iterate through a directory and read in 2 files at each iteration using pathlib.Path().glob()如何使用 pathlib.Path().glob() 遍历目录并在每次迭代时读入 2 个文件
【发布时间】:2020-04-15 04:39:38
【问题描述】:

使用pathlib.Path().glob(),我们如何遍历一个目录,每次迭代读入2个文件?

假设我的目录C:\Users\server\Desktop\Dataset 如下所示:

P1_mean_fle.csv
P2_mean_fle.csv
P3_mean_fle.csv
P1_std_dev_fle.csv
P2_std_dev_fle.csv
P3_std_dev_fle.csv

如果我想在 Pi 的每次迭代中只读取 1 个文件,我的代码将如下所示:

from pathlib import Path
import pandas as pd

file_path = r'C:\Users\server\Desktop\Dataset'
param_file = 'P*' + '_mean_fle.csv'

for i, fle in enumerate(Path(file_path).glob(param_file)):
    mean_fle = pd.read_csv(fle).values

    results = tuning(mean_fle)  #tuning is some function which takes in the file mean 
                                #and does something with this file

现在,我如何在 Pi 的每次迭代中读取 2 个文件?下面的代码不太有效,因为param_file 只能分配一种文件名类型。如果有使用pathlib 的方法,将不胜感激。

from pathlib import Path
import pandas as pd

param_file = 'P*' + '_mean_fle.csv'
param_file = 'P*' + '_std_dev_fle.csv'  #this is wrong

for i, fle in enumerate(Path(file_path).glob(param_file)):  #this is wrong inside the glob() part
    mean_fle = pd.read_csv(fle).values
    std_dev_fle = pd.read_csv(fle).values

    results = tuning(mean_fle, std_dev_fle)  #tuning is some function which takes in the two files mean 
                                             #and std_dev and does something with these 2 files

提前谢谢你。

【问题讨论】:

    标签: python loops for-loop glob pathlib


    【解决方案1】:

    如果您的文件名遵循示例中的确定性规则,最好的办法是迭代一种文件,并通过字符串替换找到相应的文件。

    from pathlib import Path
    import pandas as pd
    
    file_path = r'C:\Users\server\Desktop\Dataset'
    param_file = 'P*' + '_mean_fle.csv'
    
    for i, fle in enumerate(Path(file_path).glob(param_file)):
        stddev_fle = fle.with_name(fle.name.replace("mean", "std_dev"))
        mean_values = pd.read_csv(fle).values
        stddev_values = pd.read_csv(stddev_fle).values
    
        results = tuning(mean_values, stddev_values)
    

    【讨论】:

    • 嗨@Torben Klein,这里的fle.name.replace("mean", "std_dev")应该是fle.name.replace("_mean_fle.csv", "_std_dev_fle.csv")吗?
    • 两者都可以。 replace 搜索给定文本并将其替换为第二个文本。见docs.python.org/3/library/stdtypes.html#str.replace
    【解决方案2】:

    我建议你两种方法:

    1.

    如果您确定所有文件的编号都没有“空洞”,则可以只使用没有“glob”的文件:

    mean_csv_pattern = 'P{}_mean_fle.csv'
    std_dev_pattern = 'P{}_std_dev_fle.csv'
    
    i = 0
    while True:
        i += 1
        try:
            mean_fle = pd.read_csv(mean_csv_pattern.format(i)).values
            std_dev_fle = pd.read_csv(std_dev_pattern.format(i)).values
        except (<put your exceptions here>):
            break
        results = tuning(mean_fle, std_dev_fle)
    

    2.

    使用预取操作获取所有文件并将它们放入一个可以在主循环中查询的结构中。

    glob 用于平均文件,glob 用于 std_dev 文件,从文件名中获取数字并生成字典 {index: {'mean_file': mean_file, 'std_file': std_file)} 然后遍历排序的字典键...

    【讨论】:

    • 感谢@Don,这是 glob() 的一个很好的替代方案。请问这里的“洞”是什么意思?
    • @Leockl,我的意思是你必须确保拥有从 1 开始的所有文件:如果你有文件 1、2 和 4,则在尝试获取文件 '3' 时循环将停止
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2018-10-01
    • 2021-10-24
    • 1970-01-01
    • 2016-09-24
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多