2013-11-09 4 views
2

У меня есть файл с повторяющимися строками. Я хочу удалить один дубликат, чтобы иметь файл с уникальными строками. Но я получаю сообщение об ошибке output.writelines (uniquelines (строки строк)) ТипError: writelines() аргумент должен быть последовательностью строк Я искал те же проблемы, но я до сих пор не понимаю, что не так. Мой код:Как удалить повторяющиеся строки в файле в Python

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

ответ

2

Код использует другой открытым: codecs.open, когда он читает, open, когда он пишет.

readlines файла объекта, созданного с использованием codecs.open, возвращает список строк в Юникоде. В то время как writelines из файловых объектов создаются с использованием open, ожидайте последовательность (байтов) строк.

Replace следующие строки:

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)) 
+0

Я знал, что ошибка была очевидна) Thnx за помощью. –

0

Если вам не нужно иметь строки в После этого я предлагаю вам поместить строки в набор. set(linelist). Линейка была бы испорчена, но дубликаты исчезли бы.

1

Я бы вообще не стал кодировать или расшифровывать. Откройте только open('organizations'txt', 'rb'), а также open('wordlist_unique.txt', 'wb'), и все должно быть в порядке.

0

В python довольно распространено удаление повторяющихся объектов из последовательности с использованием набора. Единственным недостатком использования набора является то, что вы теряете порядок (так же, как вы теряете порядок в словарных клавишах, на самом деле это то же самое причина, но это не важно.) Если порядок в ваших файлах имеет значение, вы можете использовать ключи от OrderedDict (стандартная библиотека с ... 2.7, я думаю), чтобы действовать как 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)) 
+1

Вам не нужны 'readlines()': итерационные файловые объекты выдают строки. Кроме того, вам не нужны 'keys()': итерационный словарь дает ключи. – falsetru

+0

Подумайте, добавьте краткое описание, чтобы прояснить, почему ваш ответ полезен. Недостаточно всего лишь кода. – dic19

Смежные вопросы