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

处理多编码txt.gz文件时调用tokenize.detect_encoding()报TypeError错误

解决读取gzip文件时tokenize.detect_encoding的TypeError问题

嘿,我刚好踩过这个坑!咱们先拆解一下报错的原因:tokenize.detect_encoding() 这个函数要求传入的参数是一个可调用对象——简单说就是能像函数那样被调用,每次调用返回一行字节数据。但你直接传了gzip.open()返回的GzipFile实例,它是个文件对象,不是可调用的,所以才会抛出TypeError: 'GzipFile' object is not callable。

修正后的代码

你只需要把file换成file.readline就行,因为readline方法就是符合要求的可调用对象,每次调用返回文件的下一行字节:

import gzip
import tokenize

# 检测编码
with gzip.open(fIn, 'rb') as file:
    # 传入readline方法而非文件对象本身
    fInEncoding = tokenize.detect_encoding(file.readline)
    print(fInEncoding)

# 注意:检测编码时detect_encoding会读取文件的前若干行,所以如果要复用同一个文件对象,需要先seek(0)
# 或者像你原来那样重新打开文件读取
for line in gzip.open(fIn, 'rt', encoding=fInEncoding[0], errors="surrogateescape"):
    # 你的处理逻辑
    print(line)

额外提醒

  • tokenize.detect_encoding()会自动读取文件的前几行来检测编码,所以在同一个文件句柄里如果之后还要读取内容,记得先调用file.seek(0)把文件指针移回开头,否则会从检测结束的位置开始读。
  • 对于老旧非规范文件,errors="surrogateescape"是个不错的选择,能尽量保留原始字节数据避免丢失信息。

内容的提问来源于stack exchange,提问作者gagarine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:20:27