Найти - Пользователи
Полная версия: Пересечение словарей по полю
Начало » Python для новичков » Пересечение словарей по полю
1
Voland
Всем привет! Суть проблемы в следующем: есть выгрузка данных из ИС в формате csv, необходимо из этой выгрузки оставить только те строки, в которых значение поля dst_ip есть в списке ip определённого домена. Набросал вот такой код на коленке, но он работает очень долго из-за тупого перебора двух массивов. Есть ли возможность оптимизировать скорость работы?
На вход поступает 2 csv файла, первый - выгрузка, второй - список ip, которые должны быть в первом.
# Compare 2 arrays of ip
import csv
import sys
res_csv_file = open('result.csv', 'wb')
fieldnames = [
    'start', 'end', 'time', 'IMSI', 'int_ip', 'int_port', 'trans_ip', 'trans_port', 'dst_ip', 'dst_port',
    'traffic']
reswriter = csv.DictWriter(res_csv_file, delimiter=';', fieldnames=fieldnames)
reswriter.writerow(dict((fn, fn) for fn in fieldnames))
src_csv_file = open(sys.argv[1], 'rb')
ip_csv_file = open(sys.argv[2], 'rb')
src_csv_dict = csv.DictReader(src_csv_file, delimiter=';', quotechar='"')
ip_csv_dict = csv.DictReader(ip_csv_file, delimiter=';', quotechar='"')
rows = list(src_csv_dict)
totalrows = len(rows)
print "Total values to check: %s " % (totalrows)
i = 0
src_csv_file.seek(0)
for req_ip in src_csv_dict:
    i += 1
    sys.stdout.write("Progress %s%%\r" % ((i * 100) / totalrows))
    sys.stdout.flush()
    ip_csv_file.seek(0)
    for host_ip in ip_csv_dict:
        if req_ip['dst_ip'] in host_ip.values():
            reswriter.writerow(req_ip)
print "Job completed"
bismigalis
из второго файла сделай set, потом итерируйся по первому как сейчас и проверяй вхождение
py.user.next
Voland
src_csv_file.seek(0)
в чём смысл этой строки ?
удали её везде

Voland
Суть проблемы в следующем: есть выгрузка данных из ИС в формате csv, необходимо из этой выгрузки оставить только те строки, в которых значение поля dst_ip есть в списке ip определённого домена.
приведи пример исходных данных (файл с данными, список исключений)
приведи пример результата

Voland
Набросал вот такой код на коленке, но он работает очень долго из-за тупого перебора двух массивов.
все сейчас будут догадываться, какие массивы ты имеешь в виду, читая этот код полчаса
сам же его и не поймёшь через полгода

Voland
        if req_ip['dst_ip'] in host_ip.values():
во-во, все должны телепатически догадаться, какие там структуры данных
Voland
py.user.next
src_csv_file.seek(0)
Эта строка нужна для работы цикла for req_ip in src_csv_dict:
bismigalis
из второго файла сделай set, потом итерируйся по первому как сейчас и проверяй вхождение
Спасибо, действительно, работает на порядок быстрее
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB