Я пытаюсь написать код для копирования всех дубликатов файла в новый файл. Программа, которую я написал, проверяет первые 3 элемента каждой строки и сравнивает их со следующей строкой.
f=open(r'C:\Users\xamer\Desktop\file.txt','r')
data=f.readlines()
f.close()
lines=data.copy()
dup=open(r'C:\Users\xamer\Desktop\duplicate.txt','a')
for x in data:
for y in data:
if (y[0]==x[0]) and (y[1]==x[1]) and (y[2]==x[2]):
lines.append(y)
else:
lines.remove(y)
dup.write(lines)
dup.close()
Я получаю следующую ошибку:
Traceback (most recent call last):
File "C:\Users\xamer\Desktop\file.py", line 80, in <module>
lines.remove(y)
ValueError: list.remove(x): x not in list
Какие-либо предложения?
Ваш код не выполняет то, что вы говорите: он проверяет наличие дубликатов во всем файле, а не только на равенство соседних строк. Какую ты хочешь?
Для своей задачи вы можете либо скопировать уникальные строки и дубликаты data, а затем remove, за исключением первого вхождения (излишне сложного), либо начать с пустого списка и дублированных строк append. Опубликованный вами код пытается сделать и то, и другое.






Эти фрагменты должны выполнять ту работу, о которой вы просили. Вначале я подумал создать список duplicated_lines, а затем записать все это в конце. Но потом я понял, что могу оптимизировать производительность кода, избегая дополнительного финального цикла, просто записывая повторяющиеся элементы на лету.
Как подчеркнул другой пользователь, не совсем понятно, хотите ли вы проверять только смежные двойные записи или повторяющиеся элементы независимо от позиции.
В первом случае - когда повторения идут сразу после - это код:
# opening the source file
with open('hello.txt','r') as f:
# returns a list containing the original lines
data=f.readlines()
# creating the file to host the repeated lines
with open('duplicated.txt','a') as f:
for i in range(0, len(data)-1):
# stripping to avoid a bug if the last line is a repeated item
if (data[i].strip('\n') == data[i+1].strip('\n')):
print("Lines {}: {}".format(i, data[i]))
print("Lines {}: {}".format(i+1, data[i+1]))
#duplicated_lines.append(data[i])
print("Line repeated: " + data[i])
f.write("%s\n" % data[i])
Если вместо этого вы хотите проверять повторяющиеся строки по всему файлу, это код:
# opening the source file
with open('hello.txt','r') as f:
# returns a list containing the original lines
data=f.readlines()
# creating the file to host the repeated lines
with open('duplicated.txt','a') as f:
for i in range(0, len(data)-1):
for j in range(i+1, len(data)):
# stripping to avoid a bug if the last line is a repeated item
if (data[i].strip('\n') == data[j].strip('\n')):
print("Lines {}: {}".format(i, data[i]))
print("Lines {}: {}".format(j, data[j]))
#duplicated_lines.append(data[i])
print("Line repeated: " + data[i])
f.write("%s\n" % data[i])
Вы пытаетесь удалить то, чего там нет. Линия должна быть удалена раньше во время наматывания петли.