在Python中基于条件调用函数和参数

f5emj3cl  于 2023-02-20  发布在  Python
关注(0)|答案(2)|浏览(159)

我用Python写了一个函数,可以读取.csv或.xls,并将其作为panda Dataframe 返回。根据传递的file_type,该函数使用pandas.read_csv()或pandas.read_excel()函数,但参数有一点不同。它可以正常工作,但我希望减少明显重复的代码。那么我该如何做才是最好的呢?
1.只有一个函数调用被动态更改为file_type变量定义的特定函数调用
1.基于同一变量动态更改随后调用的函数的参数?
这是我目前的代码。谢谢你的帮助。

def file_to_df(file_name, fields= None, file_type = None, encoding = None):
    """Read stock level from csv or xlsx file.Filter SKU and Qty.Return dataframe."""

    if file_type == 'csv' or 'xls':
        if file_type == 'csv':
            data_frame = pd.read_csv(
                file_name,
                encoding = encoding,
                converters={'Barcode':str,'Qty':int},
                usecols=fields
            )
        elif file_type == 'xls':
            data_frame = pd.read_excel(
                file_name,
                converters={'Barcode':str,'Qty':int},
                usecols=fields
            )

        # Remove empty rows
        data_frame.replace('', np_nan, inplace=True)
        data_frame.dropna(axis=0, how='any', subset=None, inplace=True)

        return data_frame

    else:
        print('no csv or xls filetype was handed to file_to_df')

对于参数,我尝试使用两个放入函数调用的元组。

xkrw2x1b

xkrw2x1b1#

您可以修改您的签名函数并使用keyword-only参数(PEP 3102)。然后,创建一个参数dict,添加您的固定参数(转换器),重命名一些参数(字段-〉usecols)并添加其他参数作为它:

import pandas as pd
import pathlib

def file_to_df(file_name, **kwargs):
    xfile = pathlib.Path(file_name)
    
    params = {
        'converters': {'Barcode': str, 'Qty': int},  # add fixed parameters
        'usecols': kwargs.pop('fields', None)  # convert fields to usecols
    } | kwargs  # pass all other parameters as it

    # determine the right function according the extension
    funcs = {'.csv': pd.read_csv, '.xlsx': pd.read_excel}
    try:
        df = funcs[xfile.suffix](xfile, **params)
    except KeyError:
        raise RuntimeError('no csv or xls filetype was handed to file_to_df')

    return df
rjee0c15

rjee0c152#

不要传递必须Map到特定函数的字符串;只要传递正确的函数。

def file_to_df(file_name, fields=None, *, converter, **kwargs):
    """Read stock level from csv or xlsx file.Filter SKU and Qty.Return dataframe."""

    data_frame = converter(file_name, , converters={'Barcode': str, 'Qty': int}, usecols=fields, **kwargs)
    data_frame.replace('', np_nan, inplace=True)
    data_frame.dropna(axis=0, how='any', subset=None, inplace=True)

    return data_frame

 
df1 = file_to_df('foo.csv', converter=pd.read_csv)
df2 = file_to_df('foo.xlsx', converter=pd.read_excel, encoding='...')

相关问题