Как перебирать каталог и читать по 2 файла на каждой итерации, используя pathlib.Path (). Glob () - PullRequest
1 голос
/ 15 апреля 2020

Используя 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

Если я хочу читать только по 1 файлу на каждой итерации Pi, мой код будет выглядеть так:

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

Теперь, как я читаю в 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

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Если ваши имена файлов соответствуют определенным c правилам, как в примере, лучше всего перебрать один тип файлов и найти соответствующий файл путем замены строки.

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)
1 голос
/ 15 апреля 2020

Я предлагаю вам два подхода:

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.

Используйте операцию предварительной выборки, которая берет все ваши файлы и помещает их в структуру, которую вы можете запросить в своей основной l oop.

Глобус для средних файлов, глобус для файлов std_dev, взять число из имени файла и создать словарь {index: {'mean_file': mean_file, 'std_file': std_file)}, а затем l oop поверх отсортированных ключей словаря. ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...