【问题标题】:How to eliminate repetitive lines in the file: python如何消除文件中的重复行:python
【发布时间】:2017-02-22 10:32:55
【问题描述】:

我们有 2 个文件:一个包含输入数据,另一个用于放置结果。文件中的所有信息都排成一行。程序应该在文件中寻找重复的行并且只打印不重复的行。以下是输入数据的示例:

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()

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

【问题讨论】:

  • 如果你不能使用list(或dictset?)那么你应该如何存储你已经看到的行?
  • 据我了解,我们只能使用 filename.readLine(),所以我们应该以某种方式比较两条相邻的行。这是我的想法。
  • 主要问题是如何比较相邻的行,因为我的“if”语句总是False,所以程序总是转到“else”
  • 是的,因为您已经删除了第一行但没有删除连续的行..
  • @AbhishekJebaraj 即使在我删除了 rstrip() 行之后它也没有用。

标签: python string file


【解决方案1】:

您的代码中的“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

【讨论】:

    【解决方案2】:

    您比较两行,其中一个您已剥离换行符,另一行您没有,它们永远不会匹配并且所有行都将被写入。

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

    您还执行了太多的 readline 操作。一个最初是循环中的 3,这是过于频繁地阅读这些行,在我看来,您可能会错过比较某些行。使用for in 循环遍历文件要简单得多。

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

    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
    

    考虑到问题的约束,此解决方案仅在所有重复项在后续行中组合在一起时才挑选出重复行。

    【讨论】:

      【解决方案3】:
      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()
      

      【讨论】:

        【解决方案4】:

        首先迭代每一行,去掉不需要的字符并将其添加到集合中,这样唯一的值就在那里,一旦你设置了唯一值,你就可以将它写入文件。

        您可以使用以下代码

        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)
        

        【讨论】:

          【解决方案5】:

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

          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()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-11-08
            • 1970-01-01
            • 2021-07-03
            • 1970-01-01
            • 2012-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多