免责声明:我是新来的一般程序和脚本,所以请原谅缺乏技术术语
所以我有一个包含列名的两个文本文件中的数据集:
First File | Second File
bob | bob
mark | mark
larry | bruce
tom | tom
我想运行一个脚本(PREF蟒),在一个文本文件中的交叉线和不同的线在另一个文本文件输出,例如:
matches.txt:
bob
mark
tom
differences.txt:
bruce
我将如何使用Python做到这一点? 或使用Unix命令行,如果这是很容易?
words1 = set(open("some1.txt").read().split())
words2 = set(open("some2.txt").read().split())
duplicates = words1.intersection(words2)
uniques = words1.difference(words2).union(words2.difference(words1))
print "Duplicates(%d):%s"%(len(duplicates),duplicates)
print "\nUniques(%d):%s"%(len(uniques),uniques)
类似的东西,至少
排序| uniq的是好的,但可能COMM甚至更好。 “人通讯”的详细信息。
从手册页:
EXAMPLES
comm -12 file1 file2
Print only lines present in both file1 and file2.
comm -3 file1 file2
Print lines in file1 not in file2, and vice versa.
你也可以使用Python的集合类型,但通讯更加容易。
Unix外壳解决方案为:
# duplicate lines
sort text1.txt text2.txt | uniq -d
# unique lines
sort text1.txt text2.txt | uniq -u
Python字典是O(1)或非常接近,换句话说,他们是非常快的(但他们会使用大量内存,如果你索引文件比较大)。 所以在第一个文件阅读并构建一个字典是这样的:
left = [x.strip() for x in open('left.txt').readlines()]
该列表理解和钢带()是必需的,因为readlines方法你手中有尾随换行符线完好无损。 这将创建文件中的所有项目的列表,假设每行一个(使用.split如果他们都在同一行)。
现在建的字典:
ldi = dict.fromkeys(left)
这将构建与列表作为关键字项目的字典。 这还涉及重复。 现在,通过第二个文件进行迭代,并检查关键是在字典:
matches = open('matches.txt', 'w')
uniq = open('uniq.txt', 'w')
for l in open('right.txt').readlines():
if l.strip() in ldi:
# write to matches
matches.write(l)
else:
# write to uniq
uniq.write(l)
matches.close()
uniq.close()
>>> with open('first.txt') as f1, open('second.txt') as f2:
w1 = set(f1)
w2 = set(f2)
>>> with open('matches.txt','w') as fout1, open('differences.txt','w') as fout2:
fout1.writelines(w1 & w2)
fout2.writelines(w2 - w1)
>>> with open('matches.txt') as f:
print f.read()
bob
mark
tom
>>> with open('differences.txt') as f:
print f.read()
bruce