将 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
现在我的最终输出是 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