Python解析TSV文件报错TypeError: expected string or buffer求解决
解决TSV文件解析UA时的TypeError问题
我之前也踩过一模一样的坑!这个TypeError: expected string or buffer错误几乎肯定是因为TSV文件里的用户代理字段混了非字符串类型的值,而ua_parser的Parse()方法只接受字符串输入导致的——CSV能正常运行可能是因为pandas读取CSV时默认把所有字段都识别为object类型(以字符串为主),但TSV的读取逻辑可能让某些空值或特殊值被转成了NaN(非字符串类型)。
快速定位问题
先确认下你的UA字段类型和内容,排查问题根源:
df = pd.read_csv('your_file.tsv', sep='\t') # 查看UA字段的数据类型 print(df['user_agent'].dtype) # 查看前20条UA值,检查有没有NaN或非字符串内容 print(df['user_agent'].head(20))
如果输出里有NaN,或者字段类型显示float(因为NaN本质是float类型),那就是问题所在了。
三种解决方案
1. 读取TSV时强制指定UA字段为字符串
直接在读取阶段告诉pandas把UA字段按字符串处理,避免自动推断类型出错:
df = pd.read_csv('your_file.tsv', sep='\t', dtype={'user_agent': str})
这样即使是空值,也会被存为空字符串'',而不是NaN,ua_parser就能正常处理了。
2. 预处理UA字段,统一转成字符串
如果已经读取了数据,或者不想修改读取逻辑,可以先把UA字段里的非字符串值转换成空字符串或默认值:
# 把NaN填充为空字符串,再强制转成str类型 df['user_agent'] = df['user_agent'].fillna('').astype(str) # 定义提取UA家族的函数 def get_ua_family(ua): parsed = uaparser.Parse(ua) return parsed['user_agent']['family'] # 批量提取家族信息 df['ua_family'] = df['user_agent'].apply(get_ua_family)
3. 处理TSV文件的格式问题
有时候TSV文件可能有不规范的格式(比如多个制表符分隔、换行符错误),导致pandas读取时字段错位,UA字段拿到了其他类型的数据。可以试试:
# 用正则匹配多个制表符作为分隔符 df = pd.read_csv('your_file.tsv', sep='\t+', dtype={'user_agent': str}) # 跳过格式错误的行 df = pd.read_csv('your_file.tsv', sep='\t', error_bad_lines=False, dtype={'user_agent': str})
修改后的完整示例代码
结合你的原有代码,调整后大概是这样:
import pandas as pd import glob from ua_parser import user_agent_parser as uaparser def extract_ua_family(ua_str): # 额外加一层判断,保险起见 if not isinstance(ua_str, str): return 'Unknown' parsed_result = uaparser.Parse(ua_str) return parsed_result['user_agent']['family'] # 遍历所有TSV文件 for tsv_path in glob.glob('*.tsv'): # 读取时指定UA字段为字符串 df = pd.read_csv(tsv_path, sep='\t', dtype={'user_agent': str}) # 提取UA家族 df['ua_family'] = df['user_agent'].apply(extract_ua_family) # 保存处理后的文件 df.to_csv(f'processed_{tsv_path}', index=False)
内容的提问来源于stack exchange,提问作者r1ty
相关产品推荐
相关产品推荐

