我有这样的代码,它应该打开并读取两个文本文件,并在两个文件中都存在单词时进行匹配。通过打印"SUESS"并将单词写入temp.txt文件来表示匹配。
dir = open('listac.txt','r')
path = open('paths.txt','r')
paths = path.readlines()
paths_size = len(paths)
matches = open('temp.txt','w')
dirs = dir.readlines()
for pline in range(0,len(paths)):
for dline in range(0,len(dirs)):
p = paths[pline].rstrip('n').split(".")[0].replace(" ", "")
dd = dirs[dline].rstrip('n').replace(" ", "")
#print p.lower()
#print dd.lower()
if (p.lower() == dd.lower()):
print "SUCCESSn"
matches.write(str(p).lower() + 'n')
listac.txt的格式为
/teetetet
/eteasdsa
/asdasdfsa
/asdsafads
.
.
...etc
paths.txt的格式为
/asdadasd.php/asdadas/asdad/asd
/adadad.html/asdadals/asdsa/asd
.
.
...etc
因此,我使用split函数来获取点之前的第一个/asadasda(在paths.txt中)。问题是,单词似乎永远不会匹配,我甚至在每个IF语句之前打印出了每个比较,并且它们是相等的,Python在比较字符串之前还做了其他事情吗?
=======
感谢大家的帮助。按照你的建议,我清理了代码,结果是这样的:
dir = open('listac.txt','r')
path = open('paths.txt','r')
#paths = path.readlines()
#paths_size = len(paths)
for line in path:
p = line.rstrip().split(".")[0].replace(" ", "")
for lines in dir:
d = str(lines.rstrip())
if p == d:
print p + " = " + d
显然,在进入第二个for循环之前声明并初始化p会对以后的比较产生影响。当我在第二个for循环中声明p和d时,它不起作用。我不知道原因,但如果有人这样做了,我在听:)
再次感谢!
当我们将整个数据文件读入内存时,为什么不尝试使用sets
并获得交集?:
def format_data(x):
return x.rstrip().replace(' ','').split('.')[0].lower()
with open('listac.txt') as dirFile:
dirStuff = set( format_data(dline) for dline in dirFile )
with open('paths.txt') as pathFile:
intersection = dirStuff.intersection( format_data(pline) for pline in pathFile )
for elem in intersection:
print "SUCCESSn"
matches.write(str(elem)+"n")
我对两个数据集使用了相同的format_data
函数,因为它们看起来或多或少相同,但如果愿意,您可以使用多个函数。还要注意,此解决方案只将两个文件中的一个读取到内存中。与另一个的交点应该延迟计算。
正如评论中指出的那样,这并没有试图维护秩序。然而,如果你真的需要保留订单,试试这个:
<snip>
...
</snip>
with open('paths.txt') as pathFile:
for line in pathFile:
if format_line(line) in dirStuff:
print "SUCCESSn"
#...
我必须查看更多的数据集,以了解为什么没有得到匹配。我已经重构了您的一些代码,使其更加Python化。
dirFile = open('listac.txt','r')
pathFile = open('paths.txt','r')
paths = pathFile.readlines()
dirs = dirFile.readlines()
matches = open('temp.txt','w')
for pline in paths:
p = pline.rstrip('n').split(".")[0].replace(" ", "")
for dline in dirs:
dd = dline.rstrip('n').replace(" ", "")
#print p.lower()
#print dd.lower()
if p.lower() == dd.lower():
print "SUCCESSn"
matches.write(str(p).lower() + 'n')