簡體   English   中英

功能前的變量分配

[英]Variables assignement before function

我創建了一個使用pandas和xlsxwriter快速轉換數據的包。 這非常有效,我成功地完成了一些功能。 但最近我碰到了一堵牆:

對於一些函數,我需要首先定義變量,但它們不是基本類型(list,tuple,str等),而是例如數據幀。 我查看了全局變量並看到它們沒有被推薦(並且不知道放在哪里)我也看了上課但我不知道如何使用它們來解決我的問題。 我也試過創建一個空的數據幀,但在函數后得到一個空的數據幀。

我正在嘗試做的是一個帶有pandas for .csv或.xlsx的讀取函數和一個用Xlsxwriter引擎保存的函數。 目標是在代碼中盡可能少地進行更改,以便經常快速地轉換數據(例如,我的函數執行LEFT,RIGHT就像在Excel中一樣,甚至是帶有列號的MIDDLE),並且在main.py中有一個簡單的代碼。

這是我的代碼的精簡版本,它使用2個python文件(main.py和format_operations.py)。 我添加了評論,我遇到了問題。 在此先感謝您的幫助!

    """ 
    main.py
    """
    import format_operations as tbfrm #import another python file in the same folder
    import pandas as pd
    import numpy as np
    import xlsxwriter.utility

    #file settings
    file_full_path= "C:/Tests/big_data.xlsx"
    file_save_to= "C:/Tests/Xlsxwriter.xlsx"
    sheet_name_save_to= "Xlswriter"
    dfname = ??? #I need to create the variable but I don't know how
    tbfrm.FCT_universal_read(dfname,file_full_path) #CAN'T GET IT TO WORK

    #column operations and formatting
    columns_numeric = [3,6] # (with pandas) list of columns with number values by iloc number, starts at 0 which is column A in Excel
    tbfrm.FCT_columns_numeric(dfname,columns_numeric) #example of a WORKING function (if dfname is defined)

    #write with Xlsxwriter engine
    XLWRITER_DF = ??? #same problem as before, how to create the variable?
    workbookvarname = ??? #same here
    worksheetvarname = ??? # same here
    tbfrm.FCT_df_xlsxwriter(XLWRITER_DF,dfname,file_save_to,sheet_name_save_to,workbookvarname,worksheetvarname) #CAN'T GET IT TO WORK

    #### WORKING piece of code I want to execute after saving with Xlsxwriter engine ####
    worksheet.set_zoom(80)

    # Conditional formatting
    color_range_1 = "J1:J{}".format(number_rows+1)
    FORMAT1 = workbook.add_format({'bg_color': '#FFC7CE','font_color': '#9C0006'})
    FORMAT2 = workbook.add_format({'bg_color': '#C6EFCE','font_color': '#006100'})
    worksheet.conditional_format(color_range_1, {'type': 'bottom','value': '5','format': FORMAT1})
    worksheet.conditional_format(color_range_1, {'type': 'top','value': '5','format': FORMAT2})

其他檔案:

    """ 
    format_operations.py
    """
    import pandas as pd
    import numpy as np
    import xlsxwriter.utility

    def FCT_universal_read(dfname,file_full_path):
        if ".xls" in file_full_path:
            dfname = pd.read_excel(file_full_path) #optional arguments:sheetname='Sheet1', header=0 , dtype=object to preserve values
        if ".csv" in file_full_path:
            dfname = pd.read_csv(file_full_path)

    # save file with XLSXWriter engine for additional options to pandas
    def FCT_df_xlsxwriter(XLWRITER_DF,dfname,file_save_to,sheet_name_save_to,workbookvarname,worksheetvarname):
        XLWRITER_DF = pd.ExcelWriter(file_save_to, engine='xlsxwriter')
        dfname.to_excel(XLWRITER_DF, sheet_name=sheet_name_save_to,encoding='utf-8')
        workbookvarname = XLWRITER_DF.book
        worksheetvarname = XLWRITER_DF.sheets[sheet_name_save_to]

    #format as numbers
    def FCT_columns_numeric(dfname,columns_numeric):
        for x in columns_numeric:
            dfname.iloc[:,x] = pd.to_numeric(dfname.iloc[:,x])

您的FCT_universal_read函數不應修改數據框,而是返回一個新數據框:

def FCT_universal_read(file_full_path):
    if file_full_path.split('.')[-1] == "xls":
        df = pd.read_excel(file_full_path) #optional arguments:sheetname='Sheet1', header=0 , dtype=object to preserve values
    if file_full_path.split('.')[-1] == "csv":
        df = pd.read_csv(file_full_path)
    return df

在你的主要,做:

dfname = tbfrm.FCT_universal_read(file_full_path)

FCT_df_xlsxwriter的答案相同,您應該使用返回值重寫它,以便您可以執行以下操作:

    XLWRITER_DF, workbookvarname,worksheetvarname =  tbfrm.FCT_df_xlsxwriter(dfname,file_save_to,sheet_name_save_to) 

要了解python如何處理傳遞給函數的參數,您應該閱讀以下博客文章:

https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/ https://robertheaton.com/2014/02/09/pythons-pass-by-object-參考作為說明的逐菲利普-K-迪克/

您需要更新FCT_universal_read以便返回所需的數據幀。 無需在函數外部定義數據框,只需創建並返回它即可

df = FCT_universal_read('/your/file/path')

def FCT_universal_read(file_full_path):
        if ".xls" in file_full_path:
            df = pd.read_excel(file_full_path) #optional arguments:sheetname='Sheet1', header=0 , dtype=object to preserve values
            return df
        if ".csv" in file_full_path:
            df = pd.read_csv(file_full_path)
            return df

非常感謝你們兩個! 我現在得到了邏輯:)! 還要感謝文檔。

我成功地完成了這兩項功能。 我一直在掙扎幾個小時。 我喜歡你使用的.split函數,它確保腳本只查看擴展名。

我按照你的說法更新了FCT_xlsxwriter和FCT_universal_read。 以下兩個功能都已更正:

    '''
    format_operations.py
    '''
    def FCT_universal_read(file_full_path):
        if "xls" in file_full_path.split('.')[-1]:
            dfname = pd.read_excel(file_full_path) #example: C:/Tests/Bigdata.xlsx
            return dfname
        if "csv" in file_full_path.split('.')[-1]:
            dfname = pd.read_csv(file_full_path)
            return dfname


    def FCT_df_xlsxwriter(dfname,file_save_to,sheet_name_save_to):
        XLWRITER_DF = pd.ExcelWriter(file_save_to, engine='xlsxwriter')
        dfname.to_excel(XLWRITER_DF, sheet_name=sheet_name_save_to,encoding='utf-8')
        workbook = XLWRITER_DF.book
        worksheet = XLWRITER_DF.sheets[sheet_name_save_to]
        return XLWRITER_DF,workbook,worksheet

以下是我如何調用這兩個函數:

    '''
    main.py
    '''

    import format_operations as tbfrm
    import pandas as pd
    import xlsxwriter.utility

    #settings
    file_full_path= "C:/Tests/big_data.xlsx"
    file_save_to= "C:/Tests/Xlsxwriter.xlsx"
    sheet_name_save_to= "Xlswriter"

    #functions
    FILE_DF = tbfrm.FCT_universal_read(file_full_path)
    XLWRITER_DF,workbook,worksheet = tbfrm.FCT_df_xlsxwriter(FILE_DF,file_save_to,sheet_name_save_to)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM