如何在Python中加载狒狒交互压缩数据OBS_data.txt.gz?
解决狒狒观测/传感器数据加载的UnicodeDecodeError问题
核心原因
目标文件的编码并非UTF-8,而同来源的RFID文件恰好采用UTF-8编码,因此能正常加载。这类学术数据集常使用Latin-1(ISO-8859-1)或其他单字节编码。
解决方案
1. 直接指定编码读取
使用pd.read_csv时显式指定编码参数,优先尝试latin-1(该编码兼容所有字节,不会触发解码错误):
import pandas as pd # 加载观测数据 obs_df = pd.read_csv("baboon_observations.txt.gz", encoding="latin-1") # 加载传感器数据 sensor_df = pd.read_csv("baboon_sensors.txt.gz", encoding="latin-1")
若想确认准确编码,可借助chardet库检测:
import gzip import chardet with gzip.open("baboon_observations.txt.gz", "rb") as f: raw_sample = f.read(10000) # 读取前10KB数据用于检测 encoding_info = chardet.detect(raw_sample) print(encoding_info) # 输出示例:{'encoding': 'ISO-8859-1', 'confidence': 0.73}
将检测到的编码替换上述代码中的latin-1即可。
2. 二进制读取+手动处理
如果自动读取仍有问题,可手动以二进制方式读取文件,逐行解码并构建DataFrame:
import gzip import pandas as pd def load_gz_dataset(file_path, encoding="latin-1", delimiter="\t"): data_lines = [] with gzip.open(file_path, "rb") as f: for line in f: try: decoded_line = line.decode(encoding).strip() data_lines.append(decoded_line.split(delimiter)) except UnicodeDecodeError: # 可选择跳过出错行或记录错误 continue # 第一行作为列名,剩余行作为数据 return pd.DataFrame(data_lines[1:], columns=data_lines[0]) # 加载数据 obs_df = load_gz_dataset("baboon_observations.txt.gz") sensor_df = load_gz_dataset("baboon_sensors.txt.gz")
3. 验证文件完整性
若上述方法均无效,需确认文件是否下载损坏,可通过终端重新下载:
wget http://www.sociopatterns.org/datasets/baboons-interactions/baboon_observations.txt.gz wget http://www.sociopatterns.org/datasets/baboons-interactions/baboon_sensors.txt.gz
验证数据
加载完成后,使用df.head()查看前几行数据,确认编码正确且数据结构符合预期。
内容的提问来源于stack exchange,提问作者Galen
相关产品推荐
相关产品推荐

