处理多编码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
相关产品推荐
相关产品推荐

