在python中写入没有冗余行的文件

时间:2015-08-30 03:47:45

标签: python

我正在编写python脚本来从输入文件中读取行,并将唯一的行(如果相同的行不在输出文件中)写入输出文件。不知何故,我的脚本总是将第一行输入文件附加到输出文件,即使输出文件中已有相同的行。我无法弄清楚为什么会这样。 任何人都可以知道为什么以及如何解决这个问题? 感谢,

import  os

input_file= 'input.txt'
output_file = 'output.txt'

fo = open(output_file, 'a+')
flag = False
with open(input_file, 'r') as fi:
    for line1 in fi:
       print line1
       for line2 in fo:
           print line2
           if line2 == line1:
               flag = True
               print('Found Match!!')
               break
       if flag == False:
           fo.write(line1)
       elif flag == True:
           flag == False
       fo.seek(0)
    fo.close()
    fi.close()

3 个答案:

答案 0 :(得分:3)

以附加模式打开文件时,文件对象位置位于文件末尾。因此,第一次到达for line2 in fo:时,fo中没有任何行,因此跳过该块,flag仍然为真,因此第一行是写入输出文件。之后,您执行fo.seek(0),因此您要检查后续行的整个文件。

答案 1 :(得分:1)

The answer之前的{p> kmacinnis关于您的代码无效的原因是正确的;您需要使用模式'r+'而不是'a+',或者将fo.seek(0)放在for循环的开头而不是结尾。

也就是说,除了读取输入文件的每个行的整个输出文件之外,还有一个更好的方法。

def ensure_file_ends_with_newline(handle):
    position = handle.tell()

    handle.seek(-1, 2)
    handle_end = handle.read(1)
    if handle_end != '\n':
        handle.write('\n')

    handle.seek(position)


input_filepath = 'input.txt'
output_filepath = 'output.txt'

with open(input_file, 'r') as infile, open(output_file, 'r+') as outfile:
    ensure_file_ends_with_newline(outfile)

    written = set(outfile)

    for line in infile:
        if line not in written:
            outfile.write(line)
            written.add(line)

答案 2 :(得分:0)

您的旗帜从未设为False。

flag == True是一个平等

flag = True是一项任务。

尝试后者。

import  os

input_file= 'input.txt'
output_file = 'output.txt'

fo = open(output_file, 'a+')
flag = False
with open(input_file, 'r') as fi:
    for line1 in fi:
       #print line1
       for line2 in fo:
           #print line2
           if line2 == line1:
               flag = True
               print('Found Match!!')
               print (line1,line2)
               break
       if flag == False:
           fo.write(line1)
       elif flag == True:
           flag = False
       fo.seek(0)