如何用Pandas读取TSV文件并保留UTF-8编码字节字符串类型?
把TSV中的字节字面量字符串转换为真实字节类型
你的问题本质是:TSV文件中存储的不是原生字节数据,而是字节对象的Python字面量字符串(比如"b'La croisi\xc3\xa8re'"这种文本形式),所以Pandas默认会把它读成普通字符串,直接设置dtype={'my_bytestr_col': bytes}是无效的——因为Pandas不知道如何将这种字符串解析为字节对象。
下面给你两种可靠的解决思路:
方法一:读取后批量转换列
使用Python标准库的ast.literal_eval,它可以安全地解析Python字面量(包括字节字符串),比直接用eval()更安全(不会执行恶意代码)。
示例代码:
import pandas as pd import ast # 正常读取TSV文件 df = pd.read_csv('your_file.tsv', sep='\t') # 将目标列的字符串字面量转换为真实字节对象 df['my_bytestr_col'] = df['my_bytestr_col'].apply(ast.literal_eval)
执行完后,df['my_bytestr_col']的类型就会变成bytes,你可以用type(df['my_bytestr_col'].iloc[0])验证。
方法二:读取时直接转换(更高效)
如果想一步到位,在read_csv时使用converters参数,指定列的转换函数,这样读取过程中就会完成转换:
import pandas as pd import ast df = pd.read_csv( 'your_file.tsv', sep='\t', converters={'my_bytestr_col': ast.literal_eval} )
处理异常情况
如果你的列中存在格式错误的字面量(比如不是标准的b'xxx'格式),ast.literal_eval会抛出异常。这时候可以写一个带异常处理的自定义函数:
import pandas as pd import ast def safe_str_to_bytes(s): try: return ast.literal_eval(s) except (ValueError, SyntaxError): # 根据需求处理错误,比如返回空字节、原字符串或NaN return b'' df = pd.read_csv( 'your_file.tsv', sep='\t', converters={'my_bytestr_col': safe_str_to_bytes} )
内容的提问来源于stack exchange,提问作者Oriol Nieto
相关产品推荐
相关产品推荐

