如何在Python中删除文件中的重复行

时间:2013-11-09 12:59:48

标签: python file line

我有一个重复行的文件。我想要的是删除一个副本以使文件具有唯一的行。但我得到一个错误 output.writelines(uniquelines(filelines)) TypeError:writelines()参数必须是字符串序列 我搜索过同样的问题,但我仍然不明白出了什么问题。 我的代码:

def uniquelines(lineslist):
    unique = {}
    result = []
    for item in lineslist:
        if item.strip() in unique: continue
        unique[item.strip()] = 1
        result.append(item)
    return result
file1 = codecs.open('organizations.txt','r+','cp1251')
filelines = file1.readlines()
file1.close()
output = open("wordlist_unique.txt","w")
output.writelines(uniquelines(filelines))
output.close()

5 个答案:

答案 0 :(得分:2)

代码在读取时使用不同的开放:codecs.open,写入时使用open

使用readlines创建的文件对象的

codecs.open返回unicode字符串列表。虽然writelines文件对象使用open创建,但期望一系列(字节)字符串。

替换以下行:

output = open("wordlist_unique.txt","w")
output.writelines(uniquelines(filelines))
output.close()

使用:

output = codecs.open("wordlist_unique.txt", "w", "cp1251")
output.writelines(uniquelines(filelines))
output.close()

或者最好(使用with声明):

with codecs.open("wordlist_unique.txt", "w", "cp1251") as output:
    output.writelines(uniquelines(filelines))

答案 1 :(得分:1)

我根本不打扰编码或解码...只需打开open('organizations'txt', 'rb')以及open('wordlist_unique.txt', 'wb')即可。你应该没问题。

答案 2 :(得分:0)

如果您之后不需要按顺序排列,我建议您将字符串放入一组中。 set(linelist)。线序将被搞砸,但副本将消失。

答案 3 :(得分:0)

在python中使用set从序列中删除重复的对象是很常见的。使用set的唯一缺点是你丢失了订单(就像你在字典键中松开订单一样,实际上它是相同的完全的原因,但这并不重要。)如果您的文件中的订单很重要,那么你我可以使用OrderedDict的键(我认为......的标准库)来充当psudo-set,并从一系列字符串中删除重复的字符串。如果订单无关紧要,请使用set()代替collections.OrderedDict.fromkeys()。使用文件模式'rb'(读取二进制)和'wb'(写二进制),您不必担心编码 - Python会将它们视为字节。这使用了2.5之后引入的上下文管理器语法,因此如果这是一个语法错误,您可能需要根据需要调整上下文库。

import collections

with open(infile, 'rb') as inf, open(outfile, 'wb') as outf:
    outf.writelines(collections.OrderedDict.fromkeys(inf))

答案 4 :(得分:0)

您好得到其他解决方案:

对于此文件:

01 WLXB64US
01 WLXB64US
02 WLWB64US
02 WLWB64US
03 WLXB67US
03 WLXB67US
04 WLWB67US
04 WLWB67US
05 WLXB93US
05 WLXB93US
06 WLWB93US
06 WLWB93US

解决方案:

def deleteDuplicate():
    try:
        f = open('file.txt','r')
        lstResul = f.readlines()
        f.close()
        datos = []
        for lstRspn in lstResul:
            datos.append(lstRspn)
        lstSize = len(datos)
        i = 0
        f = open('file.txt','w')
        while i < lstSize:
            if i == 0:
                f.writelines(datos[i])
            else:
                if (str(datos[i-1].strip())).replace(' ','') == (str(datos[i].strip())).replace(' ',''):
                    print('next...')
                else:
                    f.writelines(datos[i])
            i = i + 1

    except Exception as err: