У меня есть три папки в 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']
}
А как насчет папок внутри папок? Обсуждал ли ваш наставник с вами такую возможность?
"папки - это базы данных" Что?






Как насчет чего-то вроде этого, которое читает файлы и помещает их в список внутри словаря:
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/» кажется довольно странным решением.
это было задумано так, что вы можете иметь столько папок, сколько захотите, и путь может быть где угодно. Дикт папок представляет собой список ключей и путей для сканирования, затем он создает еще один словарь,folder_contents с тем же ключом и файлы для этого ключа. Вы можете легко получить его, используя массив ['folder1'] и используя os.path.basename(path)
@YounElan У вас нет массива . У вас есть список.
@Matthias: правильно, на самом деле это список внутри словаря. Я использовал массив слов в общем термине
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, а не со списка папок, как предложено в ОП? Говорит ли ОП что-нибудь о рекурсивном поиске?
Здесь сделаем некоторые предположения.
На этой основе это так же просто, как:
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)
Просто прочитайте содержимое каталога и затем соберите из него структуру данных. В чем именно ваша проблема с этими двумя частями? Что вы уже пробовали и что не дало ожидаемых результатов? В данном случае вы описали задачу, а не проблему. Поскольку это тоже похоже на домашнее задание, вам также следует продемонстрировать некоторые усилия со своей стороны. Для справки читайте Как спросить и тур.