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

У меня есть три папки в GCS, и я хочу создать словарь, в котором имя папки будет ключом, а ее содержимое — значениями без file_type в качестве значений. Как мне это сделать?

Для большей ясности: папки представляют собой базы данных, и я запускаю

select * from information_schema

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

Пример: В следующей папке у меня есть эти файлы temp_folder/stats/data_transfer/

extraction.csv
united_sync.csv
united_configs.csv
united_history.csv

В другой папке temp_folder/stats/appointments/ У меня есть следующее

appointment_history.csv
appointment_configs.csv
appointment_transactions.csv

Ожидаемый результат:

folders_dict = {
    'data_transfer': ['extraction', 'united_sync', 'united_configs', 'united_history'],
    'appointment': ['appointment_history', 'appointment_configs', 'appointment_transactions']
}

Просто прочитайте содержимое каталога и затем соберите из него структуру данных. В чем именно ваша проблема с этими двумя частями? Что вы уже пробовали и что не дало ожидаемых результатов? В данном случае вы описали задачу, а не проблему. Поскольку это тоже похоже на домашнее задание, вам также следует продемонстрировать некоторые усилия со своей стороны. Для справки читайте Как спросить и тур.

Ulrich Eckhardt 12.07.2024 15:41

А как насчет папок внутри папок? Обсуждал ли ваш наставник с вами такую ​​возможность?

SIGHUP 12.07.2024 15:57

"папки - это базы данных" Что?

SIGHUP 12.07.2024 16:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
66
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Как насчет чего-то вроде этого, которое читает файлы и помещает их в список внутри словаря:

import os

folders = {
    'appointment': 'temp_folder/stats/appointments/',
    'data_transfer': 'temp_folder/stats/data_transfer'
}

folder_contents = {}

for folder_name, folder_path in folders.items():
    folder_contents[folder_name] = []
    files = os.listdir(folder_path)
    for file in files:
        name, extension = os.path.splitext(file)
        folder_contents[folder_name].append(name)

print(folder_contents)

Какой массив вы имеете в виду? Почему папки — это словарь, а не просто список имен каталогов, из которого можно получить ключ словаря? Сопоставление «назначения» с «temp_folder/stats/appointments/» кажется довольно странным решением.

SIGHUP 12.07.2024 17:06

это было задумано так, что вы можете иметь столько папок, сколько захотите, и путь может быть где угодно. Дикт папок представляет собой список ключей и путей для сканирования, затем он создает еще один словарь,folder_contents с тем же ключом и файлы для этого ключа. Вы можете легко получить его, используя массив ['folder1'] и используя os.path.basename(path)

Youn Elan 12.07.2024 17:41

@YounElan У вас нет массива . У вас есть список.

Matthias 12.07.2024 20:08

@Matthias: правильно, на самом деле это список внутри словаря. Я использовал массив слов в общем термине

Youn Elan 13.07.2024 16:16
from pathlib import Path

folders_dict = {}
for folder in Path(".").glob("*/"):
    csv_files = list(Path(f"./{folder}").glob("**/*.csv"))

    if csv_files:
        folders_dict[str(folder)] = [
            str(file.relative_to(folder).with_suffix("")) for file in csv_files
        ]

Пожалуйста, опишите логику «вашего» кода. Почему вы начинаете с CWD, а не со списка папок, как предложено в ОП? Говорит ли ОП что-нибудь о рекурсивном поиске?

SIGHUP 12.07.2024 16:45

Здесь сделаем некоторые предположения.

  1. Вам не нужен рекурсивный поиск
  2. Вас интересуют только файлы CSV.
  3. У вас есть список имен папок (каталогов) Python, которые доступны из вашего текущего рабочего каталога.

На этой основе это так же просто, как:

from pathlib import Path

list_of_folders = [
    Path("temp_folder/stats/data_transfer"),
    Path("temp_folder/stats/appointments"),
]

result = {}

for folder in list_of_folders:
    key = folder.name
    for file in folder.glob("*.csv"):
        result.setdefault(key, []).append(file.stem)

print(result)

Учитывая иерархию папок в ОП и их содержимое, это приведет к:

{'data_transfer': ['united_configs', 'united_history', 'extraction', 'united_sync'], 'appointments': ['appointment_configs', 'united_history', 'appointment_history']}

import os

def get_folder_contents_with_suffix(folder_paths, suffix):
    
    folders_dict = {}

    # Iterate through the folder paths
    for folder_name, folder_path in folder_paths.items():
        try:
            # List all files in the folder
            files = os.listdir(folder_path)
            # Filter and extract file names without extensions if they have the specified suffix
            file_names = [os.path.splitext(file)[0] for file in files if file.endswith(suffix) and os.path.isfile(os.path.join(folder_path, file))]
            # Add the folder name and its file names to the dictionary
            folders_dict[folder_name] = file_names
        except FileNotFoundError:
            print(f"Error: The folder '{folder_path}' does not exist.")
        except Exception as e:
            print(f"An error occurred while processing the folder '{folder_path}': {e}")

    return folders_dict

# Define your folder paths
folder_paths = {
    'appointment': 'temp_folder/stats/appointments/',
    'data_transfer': 'temp_folder/stats/data_transfer/'
}

# Define the suffix to filter files
suffix = '.csv'

# Get the folder contents with the specified suffix
folder_contents = get_folder_contents_with_suffix(folder_paths, suffix)

# Print the resulting dictionary
print(folder_contents)

Другие вопросы по теме