【问题标题】:Why is it so much slower to export my data to .xlsx than to .xls or .csv?为什么将我的数据导出到 .xlsx 比导出到 .xls 或 .csv 慢得多?
【发布时间】:2014-05-30 11:20:06
【问题描述】:

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

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

【问题讨论】:

  • .xlsx 文件是已压缩到 zip 存档中的文件包。后者可能是一个不小的原因。

标签: python excel pandas


【解决方案1】:

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

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

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

它应该和 xls 引擎一样快。

【讨论】:

  • 成功了!谢谢你。运行时间为 3.1 秒,其中导出时间约为 1.5 秒。此外,对于阅读本文的任何人,请确保您拥有 pandas 0.13.1 版本,因为它在 0.12.0 上对我不起作用。
  • 问题是,我猜你不能用这个引擎附加新的工作表......
  • @MehmedB 这个问题和答案都是旧的。现在 OpenPyXL 和 XlsxWriter 一样快,所以你可以使用它 OpenPyXL 你需要添加工作表。
【解决方案2】:

根据不同的 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")

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多