Создавать папки динамически и записывать файлы CSV в эти папки

Я хотел бы прочитать несколько входных файлов из папки, выполнить некоторые преобразования, создать папки на лету и записать CSV в соответствующие папки. Дело в том, что у меня есть входной путь, который похож на

Входные файлы \ P1_set1 \ Set1_Folder

filenames = sorted(glob.glob('Input files\P*_set1\*.csv'))
for f in filenames:
   print(f)     #This will print the full path
   print(f[12:]) # This print the folder structure along with filename
   df_transform = pd.read_csv(f)
   df_transform = df_transform.drop(['Format 10','Time','Hour'],axis=1)
   df_transform.to_csv("Output\" + str(f[12:]),index=False)
File
filenames = sorted(glob.glob('Input files\P*_set1\*.csv'))
for f in filenames:
   print(f)     #This will print the full path
   print(f[12:]) # This print the folder structure along with filename
   df_transform = pd.read_csv(f)
   df_transform = df_transform.drop(['Format 10','Time','Hour'],axis=1)
   df_transform.to_csv("Output\" + str(f[12:]),index=False)
Hour09.csv - для одного пациента (этот файл содержит показания пациента (P1) на 9-й час)

Точно так же для каждого пациента есть несколько файлов, и файлы каждого пациента сгруппированы в каждой папке, как показано ниже.

введите описание изображения здесь

Итак, чтобы прочитать каждый файл, я использую регулярное выражение с подстановочными знаками, как показано ниже в коде

Я уже пробовал использовать пакет glob и могу успешно его прочитать, но столкнулся с проблемой при создании выходных папок и сохранении файлов. Я разбираю строку файла, как показано ниже

f = Входные файлы \ P1_set1 \ Set1_Folder

filenames = sorted(glob.glob('Input files\P*_set1\*.csv'))
for f in filenames:
   print(f)     #This will print the full path
   print(f[12:]) # This print the folder structure along with filename
   df_transform = pd.read_csv(f)
   df_transform = df_transform.drop(['Format 10','Time','Hour'],axis=1)
   df_transform.to_csv("Output\" + str(f[12:]),index=False)
File
filenames = sorted(glob.glob('Input files\P*_set1\*.csv'))
for f in filenames:
   print(f)     #This will print the full path
   print(f[12:]) # This print the folder structure along with filename
   df_transform = pd.read_csv(f)
   df_transform = df_transform.drop(['Format 10','Time','Hour'],axis=1)
   df_transform.to_csv("Output\" + str(f[12:]),index=False)
Hour09.csv

f [12:] = P1_set1 \ Set1_Folder

filenames = sorted(glob.glob('Input files\P*_set1\*.csv'))
for f in filenames:
   print(f)     #This will print the full path
   print(f[12:]) # This print the folder structure along with filename
   df_transform = pd.read_csv(f)
   df_transform = df_transform.drop(['Format 10','Time','Hour'],axis=1)
   df_transform.to_csv("Output\" + str(f[12:]),index=False)
File
filenames = sorted(glob.glob('Input files\P*_set1\*.csv'))
for f in filenames:
   print(f)     #This will print the full path
   print(f[12:]) # This print the folder structure along with filename
   df_transform = pd.read_csv(f)
   df_transform = df_transform.drop(['Format 10','Time','Hour'],axis=1)
   df_transform.to_csv("Output\" + str(f[12:]),index=False)
Hour09.csv

filenames = sorted(glob.glob('Input files\P*_set1\*.csv'))
for f in filenames:
   print(f)     #This will print the full path
   print(f[12:]) # This print the folder structure along with filename
   df_transform = pd.read_csv(f)
   df_transform = df_transform.drop(['Format 10','Time','Hour'],axis=1)
   df_transform.to_csv("Output\" + str(f[12:]),index=False)

Я ожидаю, что в выходной папке будут файлы csv, сгруппированные по каждому пациенту в соответствующих папках. На снимке экрана ниже показано, как преобразованные файлы должны быть расположены в выходной папке (та же структура, что и входная папка). Обратите внимание, что папка вывода уже существует (ее легко создать, как вы знаете) введите описание изображения здесь


person The Great    schedule 04.04.2019    source источник


Ответы (1)


Итак, чтобы читать файлы в папке, используйте библиотеку os, тогда вы можете сделать

import os
folder_path = "path_to_your_folder"
dir = os.listdir(folder_path)
for x in dir:
    df_transform = pd.read_csv(f)
    df_transform = df_transform.drop(['Format 10','Time','Hour'],axis=1)
    if os.path.isdir("/home/el"):
        df_transform.to_csv("Output/" + str(f[12:]),index=False)
    else:
        os.makedirs(folder_path+"/")
        df_transform.to_csv("Output/" + str(f[12:]),index=False)    

Теперь вместо пользователя f [12:] разделите x в цикле for, например

file_name = x.split('/')[-1] #if you want filename.csv

Дай мне знать, если это то, что ты хотел

person Bhawesh Chandola    schedule 04.04.2019
comment
Когда glob позволяет мне извлекать файлы из разных каталогов на основе совпадений с подстановочными знаками, я могу просто использовать функцию os.makedirs () при записи файла csv, передавая f [12:] в качестве аргумента. вы бы порекомендовали это? - person The Great; 04.04.2019
comment
Да, вы можете просто использовать os.makedirs для создания каталога с помощью glob, если вы уверены, что имя файла будет существовать после 12-го индекса - person Bhawesh Chandola; 04.04.2019
comment
@ Бхавеш Чандола - Не могли бы вы помочь мне с проблемой, указанной ниже? t = os.makedirs (Output \\ + str (f [12:20])) # f [12:20] дает P1_set1, P2_set1 и т. д. df_transform.to_csv (str (t) + \ + str (f [21:] ), индекс = Ложь). Я могу успешно создать выходной каталог с каждой папкой пациента, но не могу записать CSV в эти папки. - person The Great; 04.04.2019
comment
Я получаю синтаксическую ошибку EOL при сканировании строкового литерала, даже если круглые скобки сбалансированы. Ниже приведен фрагмент кода, вызывающий проблему df_transform.to_csv (str (t) + \ + str (f [21:]), index = False) - person The Great; 04.04.2019
comment
@SELVA os.makedirs не возвращает путь к указанной папке, просто сохраните каталог создаваемой папки в переменной и используйте в to_csv, например x = Output \\ + str (f [12:20]) os. makedirs (x) df_transform.to_csv (x + \ + str (f [21:]), index = False) - person Bhawesh Chandola; 04.04.2019
comment
Вы уверены, что последний ствол правильный? Я имею в виду, что это ключевое слово df_transform.to_csv (x + \ + str (f [21:]), index = False) обычно меняет цвет на зеленый, но в данном случае это не так, даже если скобки сбалансированы. - person The Great; 04.04.2019
comment
@SELVA это связано с тем, что один '\' изменит ваш оператор на df_transform.to_csv (x + \\ + str (f [21:]), index = False) - person Bhawesh Chandola; 04.04.2019
comment
Ты обалденный - person The Great; 04.04.2019
comment
просто помогаю товарищу-разработчику. :) - person Bhawesh Chandola; 04.04.2019