3

我有一个包含重复行的文件。我想要的是删除一个副本以拥有一个具有唯一行的文件。但是我得到一个错误output.writelines(uniquelines(filelines)) TypeError: writelines() argument must be a sequence of strings 我已经搜索了相同的问题,但我仍然不明白哪里出了问题。我的代码:

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

5 回答 5

3

代码使用不同的打开方式: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))
于 2013-11-09T13:03:45.517 回答
1

我根本不会打扰编码或解码..简单地打开,open('organizations'txt', 'rb')open('wordlist_unique.txt', 'wb')应该没问题。

于 2013-11-09T13:19:53.063 回答
0

如果您以后不需要按顺序排列线条,我建议您将字符串放在一组中。set(linelist). 线序会被搞砸,但重复的东西会消失。

于 2013-11-09T13:09:12.777 回答
0

在 python 中,使用集合从序列中删除重复对象是相当常见的。使用 set 的唯一缺点是您会丢失顺序(就像您在字典键中丢失顺序一样,实际上其确切原因相同,但这并不重要。)如果文件中的顺序很重要,您可以使用 OrderedDict 的键(我认为是 2.7 的标准库)充当伪集,并从字符串序列中删除重复的字符串。如果顺序无关紧要,请使用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))
于 2013-11-09T13:32:35.080 回答
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:
于 2018-06-15T15:52:58.377 回答