Python split()在文件的第一行未按预期工作
我有一个很大的文本文件,里面记录了人们的观点,每条观点都被标记为积极、消极、中立或混合。每一行的开头都有一个符号,分别是“+ ”、“- ”、“= ”或“* ”,这些符号对应着不同的分类。此外,以“!! ”开头的行表示评论,可以忽略。
下面是一个简单的Python脚本,目的是统计每种分类的数量,并忽略评论行:
classes = [0, 0, 0, 0] # "+", "-", "=", "*"
f = open("All_Classified.txt")
for i, line in enumerate(f):
line = line.strip()
classifier = line.split(" ")[0]
if classifier == "+": classes[0] += 1
elif classifier == "-": classes[1] += 1
elif classifier == "=": classes[2] += 1
elif classifier == "*": classes[3] += 1
elif classifier == "!!": continue
else: print "Line "+str(i+1)+": \""+line+"\""
f.close()
print classes
这是“All_Classified.txt”文件前5行的示例:
!! GROUP 1, 1001 - 1512
= 1001//CD TITLETITLE//NNP How//WRB many//JJ conditioners/conditioner/NNS do//VBP you//PRP have//VBP ?//.
= 1002//CD I//PRP have//VBP two//CD different//JJ kinds/kind/NNS ,//, Garnier//NNP Fructis//NNP Triple//NNP Nutrition//NNP conditioner//NN ,//, and//CC Suave//NNP coconut//NN .//.
= 1003//CD But//CC I//PRP think//VBP I//PRP have//VBP about//IN 8//CD bottles/bottle/NNS of//IN the//DT Suave//NNP coconut//NN My//PRP$ mom//NN gave/give/VBD me//PRP a//DT bunch//NN for//IN Christmas//NNP because//IN she//PRP was/be/VBD getting/get/VBG tired/tire/VBN of//IN me//PRP saying/say/VBG I//PRP was/be/VBD out//IN
= 1004//CD TITLETITLE//NNP Need//VB a//DT gel//NN that//IN works/work/NNS ,//, 8//CD mo//NN ,//, post//NN ,//, ready//JJ to//TO relax//VB edges/edge/NNS ,//, HELP//NNP ,//,
不知为何,在第一次循环时,我的输出触发了else语句,似乎没有识别“!!”,我也不太明白为什么。我的输出是:
Line 1: "!! GROUP 1, 1001 - 1512"
[2986, 1034, 16278, 535]
另外,如果我删除“All_Classified.txt”的第一行,那么它就无法识别原本应该是第一行的“= ”。我不太确定该怎么做才能让第一行被正确识别。
编辑(再次): 根据Peter的要求,如果我把else: print "Line "+str(i+1)+": \""+line+"\""
替换成else: print "Classifier "+classifier+ " Line "+str(i+1)+": \""+line+"\""
,输出会是:
Classifier !! Line 1: "!! GROUP 1, 1001 - 1512"
[2986, 1034, 16278, 535]
编辑: 第一部分使用xxd All_Classified.txt
:
0000000: efbb bf21 2120 4752 4f55 5020 312c 2031 ...!! GROUP 1, 1
0000010: 3030 3120 2d20 3135 3132 0d0a 3d20 3130 001 - 1512..= 10
0000020: 3031 2f2f 4344 2054 4954 4c45 5449 544c 01//CD TITLETITL
0000030: 452f 2f4e 4e50 2048 6f77 2f2f 5752 4220 E//NNP How//WRB
1 个回答
3
我怀疑你的输入文件可能和你想的不同。例如,classifier
里面可能有一些控制字符,这些字符在打印时看不出来,但会影响比较结果。
>>> classifier = '!\0!'
>>> print classifier
!!
>>> classifier == '!!'
False
补充说明 就是这个:
0000000: efbb bf21 2120
^^^^ ^^
这是 UTF-8 BOM,它会成为 classifier
的一部分。
试着用 codecs.open()
打开这个文件,编码方式用 "utf-8-sig"
(可以参考一下 这个链接)。