如何解决使用tf.gfile.GFile去除回车时的utf-8编解码错误?
解决tf.gfile.GFile读取文件时的UTF-8解码错误
这个错误很常见,问题出在你读取的文件不是UTF-8编码(错误里的0xbb字节大概率是GBK/GB2312这类编码里的字符),而tf.gfile.GFile默认会用UTF-8去解码文本,所以触发了UnicodeDecodeError。下面给你几个可行的解决方法:
方法1:指定文件的实际编码解码
先确定你的文件编码(比如GBK、GB2312、ANSI等),然后手动用对应的编码解码字节流:
label_lines = [] # 以二进制模式打开文件,避免自动解码 with tf.gfile.GFile(path2, 'rb') as f: for line_byte in f: # 替换成你文件实际的编码,比如'gbk'、'gb2312' line_text = line_byte.decode('gbk').rstrip() label_lines.append(line_text)
方法2:自动检测文件编码(推荐不确定编码时用)
如果不知道文件具体编码,可以用chardet库自动检测:
- 先安装chardet:
pip install chardet
- 然后用以下代码读取:
import chardet with tf.gfile.GFile(path2, 'rb') as f: raw_content = f.read() # 检测编码,返回结果包含编码和置信度 detect_result = chardet.detect(raw_content) file_encoding = detect_result['encoding'] # 按检测到的编码解码并处理每行 all_lines = raw_content.decode(file_encoding).splitlines() label_lines = [line.rstrip() for line in all_lines]
方法3:忽略或替换解码错误(不推荐,会丢失/修改内容)
如果可以接受少量字符丢失或替换,也可以在解码时指定错误处理方式:
label_lines = [] with tf.gfile.GFile(path2, 'rb') as f: for line_byte in f: # errors='ignore'会跳过错误字符,'replace'会用�替换 line_text = line_byte.decode('utf-8', errors='ignore').rstrip() label_lines.append(line_text)
补充说明
tensorflow的tf.gfile.GFile在文本模式下会自动调用compat.as_text用UTF-8解码,所以遇到非UTF-8编码的文件就会报错。改用二进制模式读取后,我们可以完全控制解码过程,就能避免这个问题了。
内容的提问来源于stack exchange,提问作者lh47383
相关产品推荐
相关产品推荐

