我有一个大文本文件,其中的行看起来像:
data123||data456
data146||data269
data123||data456
data697||data983
data123||data456
我想在上面的例子中找到重复的行,例如data123 || data456,打印这些行,然后删除文件中除行的一个副本。我希望能够提取完全相同的LINES。
到目前为止,我有以下代码,但它似乎打印所有重复的“数据###”,如果碰巧出现不止一次,无论其他'数据###'是否配对用它。换句话说,我想提取逐字重复的整个LINES,而不仅仅是单独的'data ####'。
with open("file.txt") as f:
seen = set ()
for line in f:
line_lower =line.lower()
if line_lower in seen:
print (line)
else:
seen.add(line_lower)
答案 0 :(得分:0)
试试这个:
获取文件行
lines = open("file.txt").readlines()
根据这些行获取一组。副本不包含在集合
中ulines = set(lines)
对于集合中的每一行,我们从原始列表中删除该行的一个实例
for line in ulines:
#we know the line will exist in the list, because it exists in the set
lines.remove(line)
最后,该集合包含非重复项,并且该列表包含重复(由集合非迭代)实例。我们可以通过
获得“哪些行被复制”duplicated = set(lines)
print duplicated
print ulines
参见http://docs.python.org/2/tutorial/datastructures.html<< list.remove(x)和“5.4 sets”
答案 1 :(得分:0)
如果您的文件不是很大,这是一个简单的方法:
lines = [line.lower() for line in open("file.txt")]
unique = set(lines)
duplicates = set([line for line in unique if lines.count(line) > 1])
duplicates
将包含每个unique
值的单个实例,该值在文件中出现多次。
答案 2 :(得分:-1)
你的if语句被颠倒了。你只想打印以前没见过的线条,对吧?所以不应该是
with open("file.txt") as f:
seen = set ()
for line in f:
line_lower = line.lower()
if line_lower not in seen:
print (line)
seen.add(line_lower)