我正在将文件解析到内存,编辑它,删除多个条目,换行符等,然后将其写入新文件。
但由于某种原因,行mystatement = parsedoc[i]==parsedoc[j]
始终返回false。它应该检查接下来的20个可用行(没有到达列表之外),如果它们匹配,它应该删除它。但是,当我执行print parsedoc[i],parsedoc[j]
时,parsedoc[j]
在结尾处仍然有新行,该行应在前一行中删除,并且也不会显示在parsedoc[i]
中。我可以重新安排我的代码以避免这种情况,但为什么会这样呢?
代码:
#print "What file would you like to open?" #comment this and the next line back in
filename = "97_03_10.log" #raw_input("? ")
f = open(filename,'r')
filelines = f.readlines()
filedata = [len(filelines)]
parsedoc = []
del f
for line in filelines:
parsedoc.append(line.split("\t")[1:])
#del filelines
for i in range(20):#len(parsedoc)-1): #this is where the magic happens
if (not parsedoc[i]):
print True
continue
parsedoc[i][1] = parsedoc[i][1].replace("\n","")
if (parsedoc[i][1]==""):#remove empty entries
parsedoc[i] = []
continue
for j in range(i+1,i+(20 if (20+i<len(parsedoc)) else (len(parsedoc)-i-1))):
mystatement = parsedoc[i]==parsedoc[j]
print parsedoc[i],parsedoc[j]
if mystatement:
parsedoc[j] = []
#for line in parsedoc:
# print line
parsedoc = filter(None,parsedoc)
filedata.append(len(parsedoc))
print "Originally",
print filedata[0],
print "lines."
print "Currently",
print filedata[1],
print "lines."
for line in parsedoc[:20]:
print line
输出:只是抬头,这些是原生搜索结果。如果你拿走每个人的搜索结果并编译它们,就会有咒骂的话和通常的嫌疑。
我的输入文件的前40行,用于测试:再次,有咒骂词和其他不良词。 NSFW。
答案 0 :(得分:3)
您在第i
个元素中删除循环内的换行符,并且j
从i+1
开始,当您比较索引{{1}处的元素时}和i
,一个人将被剥夺,一个人不会。
将j
的初始化更改为:
parsedoc
在for line in filelines:
parsedoc.append(line.strip().split("\t")[1:])
/ for i
循环之前,将从每一行中删除换行符。
这也意味着您可以摆脱for j
通过此编辑,您将获得:
Originally 49 lines. Currently 44 lines.
修改:您可以使用csv
包重新编写代码:
parsedoc[i][1] = parsedoc[i][1].replace("\n","")