为何line.split('\t')[1]与0不相等?TSV文件极性筛选问题
问题分析与解决方案:提取TSV文件中极性为"0"的行
你遇到的核心问题是字符串与整数的类型不匹配,再加上行尾换行符的干扰,导致判断条件永远不成立。咱们一步步拆解原因和解决办法:
为什么line.split('\t')[1] == 0不生效?
当你读取文件中的行Je suis levant\t0\n时,line.split('\t')会得到一个列表:['Je suis levant', '0\n']。这里的第二个元素是字符串类型的'0\n',而你在判断时和整数0做比较——字符串和整数永远不会相等,自然不会进入逻辑分支。
另外还要注意:如果你的示例文件里有些行是用空格分隔(比如gnfjfklfklf 0),那split('\t')会把整行当成一个元素,直接取[1]会触发索引错误,这也是潜在的问题。
解决方案
1. 修正判断逻辑(最直接的修改)
先处理掉行尾的换行符,再用字符串'0'比较,或者转成整数后比较:
# 方式1:直接比较字符串(推荐,避免类型转换的潜在问题) if line.split('\t')[1].strip() == '0': # 方式2:转成整数后比较 if int(line.split('\t')[1].strip()) == 0:
strip()会去掉字符串首尾的空白字符(包括换行符\n、空格等),确保你拿到的是干净的'0'。
2. 用csv模块处理TSV(更鲁棒)
手动split容易踩分隔符的坑,Python内置的csv模块专门处理这类分隔符文件,能自动处理换行、分隔符等细节:
import csv for d in directory: print(" directory: ", d) splits = ['dev1'] #,'test1','train1'] for s in splits: print(" sous-dir : ", s) path = os.path.join(indir, d) with open(os.path.join(path, s+'.tsv'), 'r', encoding='utf-8') as f_in: # 指定制表符为分隔符 reader = csv.reader(f_in, delimiter='\t') next(reader) # 跳过表头行 for row in reader: # row是拆分后的列表,row[0]是句子,row[1]是极性 if len(row) >=2 and row[1].strip() == '0': doc = nlp(row[0]) line_split = [sent.text for sent in doc.sents] sentences_list.extend(line_split) print("nombres total de phrases :", len(sentences_list))
这里加了len(row)>=2的判断,防止格式不正确的行导致索引错误。
3. 调试小技巧
如果不确定问题出在哪,可以在循环里打印出实际读取到的极性内容和类型,快速定位问题:
for line in f_in: polar_part = line.split('\t')[1] print(f"读取到的极性部分: {repr(polar_part)}, 类型: {type(polar_part)}")
repr()会显示字符串的原始形态,比如如果有换行符,会直接显示'0\n',一眼就能看出问题。
内容的提问来源于stack exchange,提问作者kely789456123
相关产品推荐
相关产品推荐

