2017-10-01 2 views
1

私は、pandasとxlsxwriterを使って素早くデータを変換するパッケージを作成しました。 これはかなりうまくいっていて、私はいくつかの機能を成功させました。しかし、最近私は壁にヒットしました:関数の前の変数の割り当て

私は変数を最初に定義する必要がありますが、基本型(リスト、タプル、strなど)ではなく、データフレームなどです。私はグローバル変数を調べて、彼らが推薦されていないことを知り(そしてそれらを置く場所を知らない)、私もクラスを調べましたが、私はそれらを使って自分の問題を解決する方法を知らない。私も空のデータフレームを作成しようとしましたが、関数の後に空のデータフレームがあります。

私がしようとしているのは、.csvまたは.xlsx用のパンダとXlsxwriterエンジンで保存するための関数の読み込み関数です。 データを頻繁かつ迅速に変換するために、できるだけコードを変更しないでください(たとえば、ExcelのようにLEFT、RIGHT、またはMIDLで列番号を指定する機能があります)、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]) 

答えて

1

あなた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-reference-as-explained-by-philip-k-dick/

1

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 
1

ありがとうございます!私は今、論理:)!ドキュメントもありがとう。

私は正常に両方の機能を実行できました。私は数時間苦労していた。 私はあなたが使用した.split関数が好きです。これは、スクリプトが拡張子だけを確認することを保証します。

FCT_xlsxwriterとFCT_universal_readをあなたが言っていたとおりに更新しました。ここでは、両方の機能が修正されています

''' 
    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) 

ここ
''' 
    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 

は、私は2つの関数を呼び出す方法です

関連する問題