如何在Python中将字节字符串(如读取的gzip文本文件)转为文件句柄对象?
解决gzip字符串转文件句柄的问题
问题出在你用r.text获取gzip文件内容——gzip是二进制格式,r.text会强行把二进制数据解码为字符串,导致原始压缩结构被破坏,自然读出来是乱码。
正确的处理方式是直接获取二进制数据,再用gzip模块解析:
方法1:用gzip.GzipFile直接读取二进制流
import requests import gzip from io import BytesIO def read_url(url, params=None, **kwargs): r = requests.get(url, params=params, **kwargs) # 返回二进制内容而非文本 return r.content # 获取gzip二进制数据 gzipped_bytes = read_url("https://github.com/jolespin/walkthroughs/raw/main/data/microbiome__acute-malnutrition/sequences.fasta.gz") # 用BytesIO包装二进制数据,交给GzipFile处理 with gzip.GzipFile(fileobj=BytesIO(gzipped_bytes), mode='rb') as f: # 逐行读取解压后的内容 for line in f: print(line.decode('utf-8').strip()) break
方法2:先解压再用StringIO处理
如果需要先完整解压再处理,可使用这种方式:
import requests import gzip from io import StringIO def read_url(url, params=None, **kwargs): r = requests.get(url, params=params, **kwargs) return r.content gzipped_bytes = read_url("https://github.com/jolespin/walkthroughs/raw/main/data/microbiome__acute-malnutrition/sequences.fasta.gz") # 解压二进制数据并转为字符串 uncompressed_str = gzip.decompress(gzipped_bytes).decode('utf-8') # 用StringIO创建文件句柄 with StringIO(uncompressed_str) as f: for line in f: print(line.strip()) break
核心要点:
- 处理gzip、图片、压缩包这类二进制文件时,必须用
r.content获取原始二进制数据,r.text仅适用于纯文本内容。 - gzip模块依赖二进制数据工作,要么用
BytesIO包装后直接读取,要么先解压再转成字符串用StringIO处理。
内容的提问来源于stack exchange,提问作者O.rka
相关产品推荐
相关产品推荐

