2017-02-22 123 views
2

我们有2个文件:一个是输入数据,另一个是放置结果。文件中的所有信息都是一致的。程序应该在文件中查找重复行,并只打印不重复的行。下面是输入数据的例子:如何消除文件中的重复行:python

apple 
apple 
apple 
apple 
banana 
bargain 
brick 
brick 
sample 
sample 
simple 
text 
text 
text 

这里是输出文件的例子:

apple 
banana 
bargain 
brick 
sample 
simple 
text 

这里是我的代码:

fileFrom = open ('data.txt', 'r') 
fileTo = open ('result.txt', 'w') 

line = fileFrom.readline() 

while line != '': 
    line = line.rstrip('\n') 
    if line == fileFrom.readline(): 
     line = fileFrom.readline() 
    else: 
     fileTo.write(line + '\n') 
    line = fileFrom.readline() 

fileFrom.close() 
fileTo.close() 

出于某种原因,这个计划只是重新输入输入文件。 我的导师告诉我不要使用任何结构作为数组或列表,所以我们只需比较行。

+0

如果你不能使用'list'(或'dict'或'set'),你应该如何存储你已经看到的行? –

+1

据我所知,我们只能使用filename.readLine(),所以我们应该以某种方式比较两条相邻的线。这是我的想法。 – lili

+0

主要问题是如何比较相邻的行,因为我的“if”语句总是假的,所以程序总是去“其他” – lili

回答

2

您的阅读行在您的代码中'if'比较以及'if'内部的次数太多。不仅仅是因为你需要去掉每一行,而只是随着初始行被剥离而进行比较。

with open ('data.txt', 'r') as fileFrom: 
    with open ('result.txt', 'w') as fileTo: 
     line = fileFrom.readline() 
     while line != '': 
      line = line.rstrip('\n') 
      line2 = fileFrom.readline().rstrip('\n'); 
      while(line==line2): 
       line2 = fileFrom.readline().rstrip('\n'); 
      fileTo.write(line +'\n') 
      line = line2 
0

首先迭代每一行,不需要带性格和添加它来设置,所以,唯一的独特的价值会在那里,一旦你已经设置了一个独特的价值,你可以把它写到文件。

您可以使用下面的代码

fileFrom = open ('data.txt', 'r') 
fileTo = open ('result.txt', 'w') 


def readFile(): 
    lines=set() 
    with open('data.txt') as f: 
     for line in f: 
      lines.add(line.strip()) 
     return lines 

def writeToFile(lines): 
    for line in lines: 
     fileTo.write(line + '\n') 

lines=readFile() 
print lines 
if lines: 
    writeToFile(lines) 
2

你比较两条线其中一个你剥夺了换行和其他的你还没有,他们将永远不会匹配,并且所有线路将被写入。

line = line.rstrip('\n')   # stripped 
    if line == fileFrom.readline(): # compare stripped to non-stripped 

你也在做太多的readline操作。其中一个最初是循环中的3,这是过于频繁的读取行,看起来像我可能会错过比较一些线。使用for in循环迭代文件就简单多了。

修正比较两个值都为rstrip的值。你确实需要比较被剥离的字符串,因为最后一行没有换行符。

with open ('data.txt', 'r') as fileFrom: 
    with open ('result.txt', 'w') as fileTo: 
     last = '' 
     for line in fileFrom: 
      if line.rstrip() != last.rstrip(): 
       fileTo.write(line) 
       last = line 

该解决方案给出了该问题的约束,如果所有重复项在后续行上组合在一起,则只挑选出重复行。

0

你可以使用正则表达式吗?如果你可以,你可以尝试这个打印每个项目一次:

import re 
file1 = open("inputrep","r").read() 
file2 = open("output.txt","w") 
file2.write(re.sub(r"(\w+\n)\1+",r"\1",file1)) 
file2.close() 
1
if line == fileFrom.readline(): 
     line = fileFrom.readline() 

要调用“fileFrom.readline()”方法,每行两次。这就是为什么你的代码无法正常工作。

您可以使用此代码。

fileFrom = open("data.txt", "r") 
fileTo = open("result.txt", "w") 
unique_lines = set() 
for line in fileFrom.readlines(): 
    line = line.rstrip('\n') 
    if line not in unique_lines: # check the duplicate lines 
     fileTo.write(line+'\n') 
     unique_lines.add(line) 
fileTo.close()