Создайте al oop, чтобы открывать подпапки в папке, читать файлы json и выводить в формате csv - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь создать al oop в python, что позволит мне открыть папку, перебирать вложенные папки в ней, читать файлы json и выводить их как csv. Затем повторите l oop для каждой подпапки.

Моя директория выглядит так:

Main folder = "Exports"

Subfolder = "Folder1", "Folder2" et c ..

Файлы в подпапке = "file1. json", "file2. json" et c ...

В настоящее время я использую следующие код внутри подпапки (например, «Folder1») для создания выходного файла:

import pandas as pd
import os
path = os.getcwd()
frame = pd.DataFrame()
for filename in os.listdir(os.getcwd()):
    root, ext = os.path.splitext(filename)
    if ext == '.json':
        tmp_frame = pd.read_json(filename)
        frame = frame.append(tmp_frame, ignore_index=True)
        
frame.to_csv(os.path.join(path + ".csv"))

Мой вопрос: как мне запустить этот l oop, но в основной папке где он откроет каждую подпапку, затем запустит этот l oop и выведет файл в формате csv для каждой подпапки.

Спасибо

1 Ответ

0 голосов
/ 14 июля 2020

Давайте попробуем pathlib и defaultdict из стандартной библиотеки

мы можем создать словарь подпапок в качестве ключей и всех файлов как значений в списке.

from pathlib import Path
from collections import defaultdict

your_path = 'target_directory'

file_dict = defaultdict(list)

for each_file in Path(p).rglob('*.csv'): # change this to `.json`
    file_dict[each_file.parent].append(each_file)


print(file_dict)

ваш словарь будет списком объектов Pathlib, которые будут отдаленно напоминать этот, ключ - это подпапка (я только что напечатал имя здесь)

{Notebooks : [test.csv,
             test_file.csv,
             test_file_edited.csv] ,
test_csv : [File20200610.csv,
           File20201012 - Copy.csv,
           File20201012.csv] }

тогда мы можем просто l oop over словарь и сохраните каждый объект в целевой папке.

for each_sub_folder,files in file_dict.items():
    dfs = []
    for each_file in files:
        
        j = pd.read_json(each_file) #your read method.
        dfs.append(j) # append to list.
     df = pd.concat(dfs)
     df.to_csv(Path(target_path).joinpath(each_sub_folder.name + '.csv'),index=False)
...