You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:35:19