我有一个重复行的文件。我想要的是删除一个副本以使文件具有唯一的行。但我得到一个错误 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()
答案 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: