Python 3中Pandas to_csv写入GzipFile报错问题求助
解决Python3中内存压缩Pandas DataFrame为gzip CSV的兼容问题
这个问题本质是Python2和Python3对文本/二进制流的严格区分导致的:在Python2里字符串和字节没有明确界限,直接往二进制模式的GzipFile写文本不会报错;但Python3中,df.to_csv()默认输出的是字符串(str类型),而gzip.GzipFile在wb模式下只接受字节(bytes类型),类型不匹配就会抛出错误。
下面给你两种可行的解决方案:
方案1:用TextIOWrapper包装二进制流(兼容原代码逻辑)
把二进制的GzipFile包装成文本模式的流,让to_csv可以正常写入文本内容:
from io import BytesIO, TextIOWrapper import gzip import pandas as pd df = pd.DataFrame.from_dict({'a': ['a', 'b', 'c']}) s = BytesIO() # 先创建二进制Gzip流,再包装成文本流 with gzip.GzipFile(fileobj=s, mode='wb', filename='file.csv') as gz_file: with TextIOWrapper(gz_file, encoding='utf-8') as text_file: df.to_csv(text_file) s.seek(0) content = s.getvalue()
方案2:直接用Pandas内置的压缩参数(更简洁)
Pandas的to_csv本身支持compression参数,不需要手动处理gzip模块,代码更简洁且不容易出错:
from io import BytesIO import pandas as pd df = pd.DataFrame.from_dict({'a': ['a', 'b', 'c']}) s = BytesIO() # 直接指定compression='gzip',Pandas会自动处理压缩逻辑 df.to_csv(s, compression='gzip') s.seek(0) content = s.getvalue()
两种方案都能在Python3.6(Pandas 0.22.0)环境下正常运行,生成内存中的gzip压缩CSV字节内容。
内容的提问来源于stack exchange,提问作者Waiski
相关产品推荐
相关产品推荐

