繁体   English   中英

为什么将我的数据导出到 .xlsx 比导出到 .xls 或 .csv 慢得多?

[英]Why is it so much slower to export my data to .xlsx than to .xls or .csv?

我有一个要导出到 Excel 的数据框,人们想要它在 .xlsx 中。 我使用to_excel ,但是当我将扩展名从 .xls 更改为 .xlsx 时,导出步骤大约需要 9 秒而不是 1 秒。 导出到 .csv 甚至更快,我相信这是因为它只是一个特殊格式的文本文件。

也许 .xlsx 文件只是添加了更多功能,因此写入它们需要更长的时间,但我希望我可以做些什么来防止这种情况发生。

Pandas 默认使用 OpenPyXL 来编写 xlsx 文件,这可能比用于编写 xls 文件的 xlwt 模块慢。

尝试使用XlsxWriter作为 xlsx 输出引擎:

df.to_excel('file.xlsx', sheet_name='Sheet1', engine='xlsxwriter')

它应该和 xls 引擎一样快。

根据不同的 Python 到 Excel 模块基准测试,pyexcelerate 具有更好的性能。 下面的代码用于将 sqlite 表数据转换为 xlsx 文件数据表。 除非原始大小小于 1000000 个原始数据,否则表不会存储在 xlsx 文件中。 在这种情况下,信息存储在 csv 文件中。

def passfile(datb, tables):
    """copy to xlsx or csv files tables from query results"""
    import sqlite3
    import pandas as pd
    import timeit
    import csv
    from pyexcelerate import Workbook
    from pathlib import Path
    from datetime import date
    dat_dir = Path("C:/XML")
    db_path = dat_dir / datb
    start_time = timeit.default_timer()
    conn = sqlite3.connect(db_path)                # database connection
    c = conn.cursor()
    today = date.today()
    tablist = []
    with open(tables, 'r') as csv_file:             # tables to be collected file
        csv_reader = csv.DictReader(csv_file)
        for line in csv_reader:
            tablist.append(line['table'])           #column header
    xls_file = "Param" + today.strftime("%y%m%d") + ".xlsx"
    xls_path = dat_dir / xls_file                   # xls file path-name
    csv_path = dat_dir / "csv"                      # csv path to store big data
    wb = Workbook()                                 # excelerator file init
    for line in tablist:
        try:
            df = pd.read_sql_query("select * from " + line + ";", conn)  # pandas dataframe from sqlite
            if len(df) > 1000000:                   # excel not supported
                print('save to csv')
                csv_loc = line + today.strftime("%y%m%d") + '.csv.gz'   # compressed csv file name
                df.to_csv(csv_path / csv_loc, compression='gzip')
            else:
                data = [df.columns.tolist()] + df.values.tolist()
                data = [[index] + row for index, row in zip(df.index, data)]
                wb.new_sheet(line, data=data)
        except sqlite3.Error as error:  # sqlite error handling
            print('SQLite error: %s' % (' '.join(error.args)))
    print("saving workbook")
    wb.save(xls_path)
    end_time = timeit.default_timer()
    delta = round(end_time - start_time, 2)
    print("Took " + str(delta) + " secs")
    c.close()
    conn.close()


passfile("20200522_sqlite.db", "tablesSQL.csv")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM