将 excel 文件压缩到 python

Compress excel file in python

现在我的最终输出是 excel 格式。我想使用 gzip 压缩我的 excel 文件。有办法吗?

import pandas as pd
import gzip
import re

def renaming_ad_unit():
    with gzip.open('weekly_direct_house.xlsx.gz') as f:
        df = pd.read_excel(f)
        result = df['Ad unit'].to_list()
        for index, a_string in enumerate(result):
            modified_string = re.sub(r"\([^()]*\)", "", a_string)
            df.at[index,'Ad unit'] = modified_string

    return df.to_excel('weekly_direct_house.xlsx',index=False)

是的,这是可能的。

要创建 gzip 文件,您可以这样打开文件:

with gzip.open('filename.xlsx.gz', 'wb') as f:
    ...

不幸的是,当我尝试这样做时,我发现我得到了错误 OSError: Negative seek in write mode。这是因为Pandas excel writer在写入的时候在文件中向后移动,采用了多pass的方式来写入文件。 gzip 模块不允许这样做。

为了解决这个问题,我创建了一个临时文件,并在其中写入了 excel 文件。然后,我读回文​​件,并将其写入压缩存档。

我写了一个简短的程序来演示这一点。它从 gzip 存档中读取 excel 文件,将其打印出来,然后写回另一个 gzip 文件。

import pandas as pd
import gzip
import tempfile

def main():
    with gzip.open('apportionment-2020-table02.xlsx.gz') as f:
        df = pd.read_excel(f)
        print(df)

    with tempfile.TemporaryFile() as excel_f:
        df.to_excel(excel_f, index=False)
        with gzip.open('output.xlsx.gz', 'wb') as gzip_f:
            excel_f.seek(0)
            gzip_f.write(excel_f.read())

if __name__ == '__main__':
    main()

这是我用来演示的文件:Link

您也可以使用 io.BytesIO 在内存中创建文件并在该文件中写入 excel 然后将此文件作为 gzip 写入磁盘。

我使用 link 到 excel 来自 Nick ODell 答案的文件。

import pandas as pd
import gzip
import io

df = pd.read_excel('https://www2.census.gov/programs-surveys/decennial/2020/data/apportionment/apportionment-2020-table02.xlsx')

buf = io.BytesIO()

df.to_excel(buf)

buf.seek(0)  # move to the beginning of file

with gzip.open('output.xlsx.gz', 'wb') as f:
    f.write(buf.read())

类似于 Nick ODell 的回答。

import pandas as pd
import gzip
import io

df = pd.read_excel('https://www2.census.gov/programs-surveys/decennial/2020/data/apportionment/apportionment-2020-table02.xlsx')

with io.BytesIO() as buf:
    df.to_excel(buf)

    buf.seek(0)  # move to the beginning of file

    with gzip.open('output.xlsx.gz', 'wb') as f:
        f.write(buf.read())

测试于 Linux