#python #python-3.x #pandas
#python #python-3.x #pandas
Вопрос:
Как я могу найти файлы с одинаковым именем файла в нескольких папках, а затем выполнить те же операции?
def findCommonDeep(path1, path2):
return set.intersection(*(set(os.path.relpath(os.path.join(root, file), path) for root, _, files in os.walk(path) for file in files) for path in (path1, path2)))
lista = []
for x in [2010, 2017, 2020]:
if x > 2015:
filepath = rf'My DocumentsAnalysis{x}LateAnalysis*.csv'
else:
filepath = rf'My DocumentsAnalysis{x}Early_Analysis*.csv'
fname = os.path.basename(filepath, filepath)
findCommonDeep(fname)
for file in glob.glob(filename_common):
df = pd.read_csv(file)
df = df.set_index('date')
lista.append(df)
Комментарии:
1.
findCommonDeep
вызывается с использованием одного имени файла аргумента, но определяется с использованием 2 аргументов о пути.?2. Да, я запутался. Просто нужно найти общие файлы между всеми папками
3. можете ли вы определить, что вы подразумеваете под общим файлом?
4. Например
"file1.csv"
, во всех папках5. Просто переместите их все рекурсивно: glob.glob(‘**/file1.csv’)
Ответ №1:
Поскольку вы отметили pandas, давайте используем pandas
и pathlib
для возврата словаря файлов с похожими именами:
from pathlib import Path
import pandas as pd
def return_similair_files(start_dir : str) -> dict:
all_files = Path(start_dir).rglob('*.csv')
df = pd.DataFrame({'files' : all_files})
df['name'] = df['files'].apply(lambda x : x.name) #pathlib method.
return df.groupby('name')['files'].agg(list).to_dict()
Это вернет словарь файлов, например, так:
{'file_1.csv' : [list_of_paths]}
Затем вы можете оперировать ими по мере необходимости.
Комментарии:
1. Спасибо! Должен ли я запускать функцию в цикле или? Точное местонахождение?
2. @asd нет, функция заменяет цикл, затем вы можете создавать фреймы данных довольно просто, вызывая
dfs = {name : pd.read_csv(f) for name, file in dictionary.items() for f in files}
или что-то в этом роде 🙂3. Спасибо. Если функция имеет один параметр,
start_dir
то куда ведут пути к файлам других папок? Извините за недопонимание. Еслиstart_dir
представляет:'My DocumentsAnalysis
, я предполагаю, что это не может работать, так как в этой папке есть другие несвязанные CSV4. @asd извините, что пропустил этот комментарий, вы неправильно
rglob
поняли, что он отслеживает всю структуру каталогов. вы можете отфильтровать его, используя множествоpathlib
методов для фильтрации ваших путей. Вам придется обновить свой вопрос с помощью более конкретного варианта использования, поскольку я не понял из вашего вопроса5. Извините за недопонимание. Как мне практически использовать эту функцию? После выполнения вашей функции я должен выполнить
return_similair_files('My DocumentsAnalysis')
? Где я буду фильтровать пути?