Я пытаюсь прочитать файл csv: base_list.csv
- файл CSV с двумя столбцами
Затем прочтите file_1.csv
и удалите соответствующие значения из файла base_list.csv
, и
запишите их в новый файл csv под названием Dups.csv
Когда я запускаю это, я получаю следующую ошибку:
emails = set(emails) #"set" removes duplicates in a list TypeError: unhashable type: 'list'
Пример кода ниже:
import csv
#gather emails from base_list:
with open("H:\\Python Backups\\DeDup\\ByCSV\\base_list.csv", "rU") as base_file:
read_base_file = csv.reader(base_file, delimiter = ",")
duplicates_list = []
rows = [row for row in read_base_file]
for row in rows:
duplicates_list.extend(row)
#extract emails from other csv files (csv_files) from multiple
#columns in those csv files (email_columns):
emails = []
with open("H:\\Python Backups\\DeDup\\ByCSV\\file_1.csv", "rU") as csvfile:
read_csv = csv.reader(csvfile, delimiter = ",")
email_rows = [r for r in read_csv]
emails.extend(email_rows)
#find duplicates from base_list and remove them:
duplicates = [e for e in emails if e in duplicates_list]
for dupe in duplicates:
emails.remove(dupe)
emails = set(emails) #"set" removes duplicates in a list
#write the emails to a csv:
writer = csv.writer(open("H:\\Python Backups\\DeDup\\ByCSV\\Dups.csv", "ab"))
for email in zip(emails):
writer.writerow(email)
на самом деле я думаю, что его настоящая проблема в том, что он пытается добавить список к набору, и ему интересно, почему он получает "нехэшируемую" ошибку TypeError. ключевые слова: я думаю
Вы получаете ошибку, потому что вы пытаетесь сохранить список в наборе. Это невозможно, потому что списки в python изменяемы и, следовательно, нехешируемы.
>>> list_of_lists = [[1,2,3], ['a','b','c']]
>>> set(list_of_lists)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Измените email_rows
на
email_rows = (tuple(r) for r in read_csv)
который создаст список генераторов кортежей, который теперь может быть хеширован.
изменен, как предложено выше, все равно получить ту же ошибку в списке нехешируемых типов - email_rows = (r вместо r в read_csv)
ааа, это, вероятно, потому, что сама строка, если это список, измените ее на (tuple(r) for r in read_csv
. Я обновлю свой ответ
Спасибо, что исправили синтаксическую ошибку списка / кортежа, теперь проблема в том, что логика не работает, получаются только результаты из file_1
ваш вопрос касается удаления повторяющихся списков. Это может быть достигнуто путем преобразования их в кортежи, использования набора и повторного преобразования в список. Это обман