更新而不是覆盖Excel工作表

时间:2017-10-11 11:16:45

标签: python excel pandas openpyxl

我正在努力解决一个大问题。

我正在努力为同事实施一项计划。由于他善于使用Excel,他让我处理NHL数据。他创建了一个Excel文件,这可能会增加赢得'NHL投注池'的机会。我的功能是创建一个python程序,它将创建/更新带有相关数据的Excel表格(例如玩家统计数据,双赢游戏等)。

为了解释我的问题,假设一个带有“数据表”和“计算表”的简单Excel文件。计算表使用数据表中的数据。

如何在不制动计算的情况下更新数据表?我可以选择找到更新文件或删除文件并重新创建文件的方法,但第二个选项可能会破坏计算。也许正确的方法是比较旧数据表和新数据表并进行更新。

有没有办法调整我的代码,以便在未创建时更新Player statistics工作表?

这是我到目前为止所做的:

pull_data.py

def send_request():
    # Request

    try:
        response = requests.get(
            url="https://api.mysportsfeeds.com/v1.1/pull/nhl/2017-2018-regular/cumulative_player_stats.csv", 
            params={
                "fordate": "20171009"
            },
            headers={
                "Authorization": "Basic " +
                     base64.b64encode('{}:{}'.format(USERNAME,PASSWORD)\
                                      .encode('utf-8')).decode('ascii')
            }
        )
        print('Response HTTP Status Code: {status_code}'.format(
            status_code=response.status_code))
        print('Response HTTP Response Body: {content}'.format(
            content=response.content))
    except requests.exceptions.RequestException:
        print('HTTP Request failed')

    return response

create_and_update_xlsx_sheets.py

def player_statistics():
    """
    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__)))

    response = send_request().content
    df = pd.read_csv(io.StringIO(response.decode('utf-8')))
    writer = pd.ExcelWriter(file_name, engine='openpyxl')

    if os.path.exists(file_name):
        book = openpyxl.load_workbook(file_name)
        writer.book = book

    if 'Player statistics' in book.get_sheet_names():
        pass
    else: 
        df.to_excel(writer, 'Player statistics', index=False)


    writer.save()
    writer.close()


player_statistics()

换句话说,我可以通过以下代码替换pass,它可以工作吗?我可以使用http://openpyxl.readthedocs.io/en/latest/pandas.html进行调整吗?

if 'Player statistics' in book.get_sheet_names():
    pass
else: 
    df.to_excel(writer, 'Player statistics', index=False)

更新

请注意,此选项无关紧要,因为它会破坏计算。该工作表将被删除并再次创建,因此经过深思熟虑,但无用。

if os.path.exists(file_name):
    book = openpyxl.load_workbook(file_name)
    writer.book = book

if 'Player statistics' in book.get_sheet_names():
    std=book.get_sheet_by_name('Player statistics')
    book.remove_sheet(std)

df.to_excel(writer, 'Player statistics', index=False)

writer.save()
writer.close()

0 个答案:

没有答案
相关问题