0
def create_and_update_worksheets(): 
    """ 
    Add 'Player statistics' if the worksheet is not in file_name. 
    Otherwise, it will update the worksheet itself. 
    """ 

    os.chdir(os.path.dirname(os.path.abspath(__file__))) 

    writer = pd.ExcelWriter(file_name, engine='openpyxl') 
    row = 0 

    for item in worksheets['Game Schedule'].values(): 
     multiple_dfs(item, 'Game Schedule') 

    for sheet in writer.sheets.values(): 
     resize_columns(sheet) 

    writer.save() 
    writer.close() 
この実際のコードで

writerrowが定義されていないが、すでに定義されていますが、私はmultiple_dfsを実装することを決定したかのように私はいくつかのエラーを得ている:私が得たNameError:名前「作家」が

def multiple_dfs(item, sheets): 
    """ 
    Put multiple dataframes into one xlsx sheet 
    """ 

    response = send_request(item).content 
    df = pd.read_csv(io.StringIO(response.decode('utf-8'))) 

    df.to_excel(writer, sheets, startrow=row, index=False) 
    row = row + len(df) + 2 

writerのエラーが発生しましたが、同じことがrowで発生しました。

Traceback (most recent call last): 
    File "create_and_update_xlsx_sheets.py", line 66, in <module> 
    create_and_update_worksheets() 
    File "create_and_update_xlsx_sheets.py", line 56, in create_and_update_worksheets 
    multiple_dfs(item, 'Game Schedule') 
    File "create_and_update_xlsx_sheets.py", line 33, in multiple_dfs 
    df.to_excel(writer, sheets, startrow=row, index=False) 
NameError: name 'writer' is not defined 

これらのエラーを修正するにはどうすればよいですか?私はmultiple_dfsにそれらを再定義したくないですが、私は将来の機能でそれらを再定義する必要があります。

+1

は、あなたがそれを使用していますあなたの関数に 'writer'を渡すことができます。あなたの関数は、アクセスしていない変数を使用する方法をどのように知っていますか? 'writer'は最初からグローバル変数ではありません。 –

+0

@cᴏʟᴅs '' multiple_dfs(item、sheets、writer、row) 'を意味しますか?私はそのような練習を避けたいと思います。 'writer'を' create_and_update_worksheets() '関数に留まるグローバル変数として定義できますか?何を指示してるんですか? –

+0

なぜあなたは避けなければならない何か他のものに賛成する何かを避けたいのですか? 'global'変数は悪い習慣であり、コードの匂いにつながります。また、関数が終了する直前にライターが閉じられているので、グローバル変数は実際には使用しないでください。 –

答えて

1

writerが存在するスコープから関数を呼び出しても、呼び出し先はそれを見ることができません。つまり、pythonのスコープ規則がどのように機能するかです。

multiple_dfs関数に、writerという別のパラメータを受け入れ、呼び出し元関数から渡すことをおすすめします。 writer以外に複数の引数を渡す場合は、可変引数を使用する必要があります。

def multiple_dfs(item, sheets, *args): 
    for i, var in enumerate(args, 1): 
     print('variable {}: {}'.format(i, var)) 
    ... 

multiple_dfsを呼び出す:手始めに

multiple_dfs(item, 'Game Schedule', variable1, variable2, ...) 
+0

@ J.Doeこの行に 'writer、row = args [:2]'を追加すると、Pythonのチュートリアルを読む必要があるようです。また、あなたの間違いのために答えを受け入れることは少し不公平です、あなたは思いません。 –

+0

賢明ではありません。私の問題が完全に解決されたら、私は答えを受け入れるだろう。 –

+0

@ J.Doe変数にアクセスするには、変数が宣言されていなければなりません。 'multiple_dfs'はあなたの作家を' args [0] 'として持っていますので、その方法にアクセスするか、他のものに割り当てる必要があります。あなたがそれを知らなければ、変数とパラメータの受け渡しがどのように機能するかに関するPythonチュートリアルを読む必要があることを意味します。 –

関連する問題