Откройте более одного набора данных с pandas - PullRequest
1 голос
/ 18 июня 2020

Я хотел бы реализовать функцию, которая может открывать более одного набора данных одновременно. Путь и имена наборов данных будут переданы в качестве аргумента функции (путь необязательный). Наборы данных находятся в одном каталоге и могут иметь разные расширения (csv, json и sql), поэтому я не могу выбрать, какой из Методы "xxx", которые мне пришлось бы использовать (.read_csv, .read_ json o .read_ sql). Если l - это список, в котором у меня есть имена наборов данных, например:

l = [d1.csv, d2.json]

Я думаю, что синтаксически и семантически неверно что-то вроде следующего:

df = []
ext = [".json",".csv",".sql"]
def fun(path, l):
    for i in range(len(l)):
        if "condition on names of l[i] and files on path is TRUE": #controls if the file is within the path
            for j in range(len(ext)):
                if "condition on "ext" is TRUE": #controls the extension of the file
                    df [i] = pandas.read_ext[j](path, l[i])
    return df  

Любая помощь?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Может быть что-то вроде этого:

ext_to_fn = {
    ".csv": pd.read_csv,
    ".json": pd.read_json,
    ".xls": pd.read_excel,
}


def pd_open(basename, **kwargs):
    for ext, fn in ext_to_fn.items():
        filename = basename + ext
        if os.path.isfile(filename):
            return fn(filename, **kwargs)
    raise ValueError('No file/loader matching %s' % basename)

Он попробует каждое из известных расширений и загрузчиков:

d1 = pd_open("d1")  # tries d1.json, d1.csv, d1.xls
d2 = pd_open("d2")  # etc.

Вы также можете передать любые kwargs, которые поддерживаются всеми загрузчики, например dtype и т. д.

1 голос
/ 18 июня 2020

У меня есть функция, аналогичная AKX, в Databricks, которая вызывает хранимую процедуру в SQL для сбора различных метаданных:

вы можете использовать Path.(..).is_file, чтобы написать некоторую обработку ошибок.

r.glob будет сканировать дочерние каталоги.

from pathlib import Path
def open_variable_files(parent_path, child_paths=False):
    reader_dict = {
        ".txt": pd.read_csv,
        ".csv": pd.read_csv,
        ".json": pd.read_json,
        ".xlsx": pd.read_excel,
        '.sql'  : pd.read_sql

    }
    if child_paths == False:
        return {f.name: reader_dict[f.suffix](f) for f in Path(parent_path).glob("*")}
    elif child_paths == True:
        return {f.name: reader_dict[f.suffix](f) for f in Path(parent_path).rglob("*")}


variable_files = open_variable_files(path_to_files,child_paths=False)

for k,v in variable_files.items():
    print(k,v.head(1))


File20200610.csv    Unnamed: 0  e  f
0           0  0  0
File20201012.json   Unnamed: 0  c  d
0           0  0  0
File20201012.sql    Unnamed: 0  c  d
0           0  0  0
File20201012.txt    Unnamed: 0  c  d
0           0  0  0
output.xlsx    a
0  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...