Как прочитать в цикле .xlsx файлы с одинаковым именем из двух заданных подпапок?
Пытаюсь циклом зайти в две папки с номерами 1 и 2, которые в свою очередь лежат в папке const_Folder (заранее объявленный путь). Внутри папок 1 и 2 лежат файлы products.xlsx и имя файла в обеих одинаковые.
Мне нужно прочитать оба .xlsx файла, и сделать из низ один df с помощью concat.
В итоге, внутри df лежат только данные из папки 2.
Что я делаю не так?
for i in np.arange(1, n_param+1, 1):
i = str(i)
all_files = glob.glob(const_Folder + '\\' + i + '\\products.xlsx')
li = []
for filename in all_files:
df = pd.read_excel(filename, header=0)
li.append(df)
frame = pd.concat(li, axis=0)
Пример данных из файлов .xlsx:
Ответы (3 шт):
Скорее всего проблема в перезаписи новых данных поверх старых, необходимо объявить списком all_files и реализовать добавление данных в этот список.
Вместо:
all_files = glob.glob(const_Folder + '\\' + i + '\\products.xlsx')
Добавить
all_file.append(glob.glob(const_Folder + '\\' + str(i) + '\\products.xlsx') )
Вы используете
all_files = glob.glob(const_Folder + '\\' + i + '\\products.xlsx')
по идее, тут на выходе имеем массив путей, подходящих под шаблон. Почему бы не делать примерно вот так?
all_files = glob.glob(const_Folder + '\\[0-9]\\products.xlsx')
li = []
for filename in all_files:
df = pd.read_excel(filename, header=0)
li.append(df)
frame = pd.concat(li, axis=0)
Синтаксис не проверял, печатал в браузере, идея должна быть понятна.. ссылка на описание синтаксиса и примеров использования https://pythonworld.ru/moduli/modul-glob.html
Если в папке const_Folder существуют только две подпапки с нужным файлом:
from pathlib import Path
df = pd.concat([pd.read_excel(f)
for f in Path(const_Folder).glob("**/products.xlsx")],
ignore-index=True)
Если файл "products.xlsx" существует и в других подпапках, из которых его читать не надо:
import os.path as osp
dir_template = osp.join("const_Folder", "{}/products.xlsx")
subdirs = ["1", "2"]
df = pd.concat([pd.read_excel(dir_template.format(i))
for i in subdirs],
ignore_index=True)
