У меня разные файлы csv и excel для загрузки в pandas, и мне было интересно динамически создавать структуру загрузки (пример: df1 = pd.read_csv(xxxxx)
), поэтому я df1 = pd.read_csv(xxxxx)
файлы и создаю команду и сохраняю их в толковый словарь.
Проблема заключается в том, что словарь хранит значения в виде строки, и оттуда я могу загрузить файлы csv и перейти через dataframe.
Он работает, если я использую exec и eval, но я ищу альтернативы. пока: создать команду.
for i in list1:
df_dic[calendar.month_abbr[int(i[4:6])]] = ''.join('''df_lst_'''+calendar.month_abbr[(int(i[4:6]))]+''' = pd.read_excel(r'''+"'"+dir1+i+"'"+','+'sheet_name='''''Data'''"'"+')')
то я создаю новый dict только с основанием только на df_list[X]
чтобы манипулировать им позже, но снова он хранится как строка. Я пробовал разные подходы (например, ast.literal_eval, который дает мне ValueError: malformed node or string
). Я застрял
Есть идеи?
Цените любую помощь.
ура
Можете попробовать
def load_csvs(*paths):
dfs = {}
for path in paths:
dfs[path] = pd.read_csv(path)
return dfs
if __name__ == '__main__':
paths = ['foo.csv', 'bar.csv']
dfs = load_csvs(paths)
# Access the foo.csv dataframe as foo_df
foo_df = dfs['foo.csv']
Вы можете получить доступ к файлам данных по своим путям, чтобы манипулировать ими и так далее.
Вы можете использовать понимание dict:
import pandas as pd
paths = ['file1.csv', 'file2.csv']
dfs = {p: pd.read_csv(p) for p in paths}
Если вы также хотите читать файлы Excel, это та же самая команда, вы можете использовать
paths = ['file1.csv', 'file2.csv', 'excel_file.xls']
dfs = {p: pd.read_csv(p) if p.endswith('.csv') else pd.read_excel(p) for p in paths}
Решение @jorge с циклом имеет то преимущество, что вы можете обернуть каждый read_csv
в блок try-catch, чтобы вы могли обрабатывать поврежденные файлы.