2015-05-19 2 views
-4

Мне нужно найти дубликаты в моем txt-файле. Файл выглядит следующим образом:Сортировка для дубликатов в файле из 33 000 строк

3,3090,21,f,2,3 
4,231,22,m,2,3 
5,9427,13,f,2,2 
6,9942,7,m,2,3 
7,6802,33,f,3,2 
8,8579,11,f,2,4 
9,8598,11,f,2,4 
10,16729,23,m,1,1 
11,8472,11,f,3,4 
12,10976,21,f,3,3 
13,2870,21,f,2,3 
14,12032,10,f,3,4 
15,16999,13,m,2,2 
16,570,7,f,2,3 
17,8485,11,f,2,4 
18,8728,11,f,3,4 
19,20861,9,f,2,2 
20,19771,34,f,2,2 
21,17964,10,f,2,2 

Существует ~ 30000 строк этого. И теперь мне нужно найти дубликаты во втором столбце и сохранить их в новых файлах без дубликатов. Мой код:

def dedupe(data): 
    d = [] 
    for l in lines: 
     if l[0] in d: 
      d[l[0]] += l[:1] 
     else: 
     d[l[0]] = l[1] 
    return d 

#m - male 
#f - female 

data = open('plec.txt', 'r') 
save_m = open('plec_m.txt', 'w') 
save_f = open('plec_f.txt', 'w') 

lines = data.readlines()[1:] 

for line in lines: 
    gender = line.strip().split(',')[3] 
    if gender is 'f': 
     dedupe(line) 
     save_f.write(line) 
    elif gender is 'm': 
     dedupe(line) 
     save_m.write(line) 

Но я получаю эту ошибку:

Traceback (most recent call last): 
File "plec.py", line 88, in <module> 
     dedupe(line) 
File "plec.py", line 75, in dedupe 
     d[l[0]] = l[1] 
TypeError: list indices must be integers, not str' 
+5

Работает ли это? Если нет, какая у вас проблема? – SuperBiasedMan

+0

Поиск дубликатов не работает. Сохранение файла «женщина-файл» и «мужчина-файл» в порядке. Но алгоритм поиска дубликатов не работает. – Fempter

+1

Какой результат вы получаете? «Не работает» может означать, что файл пуст или что он имеет каждую строку или что он сбой. – SuperBiasedMan

ответ

1
seen = set() 
for row in my_filehandle: 
    my_2nd_col = row.split(",")[1] 
    if my_2nd_col in seen: 
     continue 
    output_filehandle.write(row) 
    seen.add(my_2nd_column) 

является один очень многословным способ сделать это

0

ОП, я не знаю, что это неправильно с вашим кодом, но это решение должно соответствовать вашим требованиям, исходя из ваших требований:

  • фильтр файла основан на второй колонке
  • магазина мужских и женские записей в отдельных файлах

Вот код:

with open('plec.txt') as file: 
    lines = map(lambda line: line.split(','), file.read().split('\n')) # split the file into lines and the lines by comma 
    filtered_lines_male = [] 
    filtered_lines_female = [] 
    second_column_set = set() 
    for line in lines: 
     if(line[1] not in second_column_set): 
      second_column_set.add(line[1]) # add to index set 
      if(line[3] == 'm'): 
       filtered_lines_male.append(line) # add to male list 
      else: 
       filtered_lines_female.append(line) # add to female list 

    filtered_lines_male = '\n'.join([','.join(line) for line in filtered_lines_male]) # apply source formatting 
    filtered_lines_female = '\n'.join([','.join(line) for line in filtered_lines_female]) # apply source formatting 

    with open('plec_m.txt', 'w') as male_write_file: 
     male_write_file.write(filtered_lines_male) # write male entries 

    with open('plec_f.txt', 'w') as female_write_file: 
     female_write_file.write(filtered_lines_female) # write female entries 

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

2

Вы можете использовать Pandas, чтобы прочитать ваш входной файл и удалить дубликаты на основе любого столбца, который вы хотите.

from StringIO import StringIO 
from pandas import DataFrame 

data =StringIO("""col1,col2,col3,col4,col5,col6 
3,3090,21,f,2,3 
4,231,22,m,2,3 
5,9427,13,f,2,2 
6,9942,7,m,2,3 
7,6802,33,f,3,2 
8,8579,11,f,2,4 
9,8598,11,f,2,4 
10,16729,23,m,1,1 
11,8472,11,f,3,4 
12,10976,21,f,3,3 
13,2870,21,f,2,3 
14,12032,10,f,3,4 
15,16999,13,m,2,2 
16,570,7,f,2,3 
17,8485,11,f,2,4 
18,8728,11,f,3,4 
19,20861,9,f,2,2 
20,19771,34,f,2,2 
21,17964,10,f,2,2""") 

df = DataFrame.from_csv(data, sep=",", index_col=False) 
df.drop_duplicates(subset='col2') 
df.to_csv("no_dups.txt", index = false) 
Смежные вопросы