使用Python requests获取哈佛Dataverse文件出现问号乱码求助
问题解决:Harvard Dataverse数据集提取乱码问题
你遇到的问号乱码,是因为目标文件是二进制压缩包,不是纯文本CSV,直接用r.text读取会导致编码解析错误,且写入CSV的方式也完全错误。以下是修正方案:
问题分析
- 从响应头能看到,该文件的
Content-Type为application/zip,属于二进制压缩文件,并非纯文本格式。 r.text会尝试用默认编码解析二进制内容,必然出现乱码;csv.writerows(r.text)会把字符串的每个字符拆成单独单元格,完全不符合CSV格式规范。
修正步骤
- 获取原始二进制响应内容,避免编码解析错误
- 解压压缩包,读取内部的CSV文件
- 用pandas直接加载CSV数据
修正后的代码
import requests import pandas as pd import zipfile from io import BytesIO url = "https://dataverse.harvard.edu/api/access/datafile/5856951" # 发送请求获取二进制内容 r = requests.get(url) # 检查请求是否成功 if r.status_code == 200: # 将二进制内容转为内存字节流,用于解压 zip_stream = BytesIO(r.content) # 解压ZIP文件 with zipfile.ZipFile(zip_stream, 'r') as zip_ref: # 获取压缩包内的文件名(假设包内只有一个CSV文件) csv_filename = zip_ref.namelist()[0] # 读取并加载CSV数据 with zip_ref.open(csv_filename) as csv_file: df = pd.read_csv(csv_file) print("数据前10行:") print(df.head(10)) else: print(f"请求失败,状态码:{r.status_code}")
关键说明
- 用
r.content获取原始二进制数据,跳过编码解析环节,避免乱码 - 通过
BytesIO在内存中处理压缩包,无需先保存ZIP文件到本地(若需要本地备份,也可先将r.content写入ZIP文件再解压) - 直接用pandas读取解压后的CSV,省去手动写入文件的冗余步骤
内容的提问来源于stack exchange,提问作者sandklk
相关产品推荐
相关产品推荐

