#python-3.x #regex #sorting #arraylist #split
Вопрос:
У меня есть file.txt с такими URL-адресами, как:
asd.com/abc.xyz?b=21
asd.com/abc.xyz?a=1amp;c=2
asd.com/abc.xyz?a=12amp;d=21
asd.com/abc.xy?b=21
asd.com/abc.xy?a=1amp;c=2
asd.com/abc.xy?a=12amp;d=21
Мне нужен такой результат, как:
asd.com/abc.xyz?a=amp;b=amp;c=amp;d=
asd.com/abc.xy?a=amp;b=amp;c=amp;d=
Как видно, я хочу, чтобы каждый параметр определенного URL-адреса был связан только с одним.
Я написал код для разделения по ? и убрать все после этого ? а затем удалил дубликат, но мой код полностью удаляет a, b, c и d из URL-адресов
lines_seen = set() # holds lines already seen outfile = open("out.txt", "w") actualout = open("output.txt", "w") for line in open("txt", "r"): line = line.split("?", 1)[0] outfile.write(line "n") outfile.close() for line in open("out.txt", "r"): if line not in lines_seen: # not a duplicate actualout.write(line) lines_seen.add(line) actualout.close()
Комментарии:
1. Когда у вас есть два значения для одного параметра, например
"asd.com/abc.xyz?a=1amp;c=2", "asd.com/abc.xyz?a=12amp;d=21"
, как вы решаете, какое значение сохранить? Ты хочешьa=1
илиa=12
?2. Я бы на самом деле заменил все значения на подстановочный знак, чтобы лучше соответствовать, или использовал только первое значение, разные параметры в определенном URL-адресе-это то, что я ищу 🙂
Ответ №1:
- Разделиться на
?
- Сгруппируйте по первой части URL-адреса
- Объедините все вторые части URL-адреса для одной и той же группы
Примечание: Я настоятельно рекомендую вам использовать with
контексты для инкапсуляции вызовов open()
.
from itertools import groupby from operator import itemgetter with open('txt', 'r'), open('output.txt', 'w') as in_file, out_file: for bareurl,g in groupby((line.split('?') for line in sorted(in_file)), itemgetter(0)): out_file.write( ''.join([bareurl, '?', 'amp;'.join(spliturl[1] for spliturl in g), 'n']) ) # OUTPUT: # asd.com/abc.xy?a=1amp;c=2amp;a=12amp;d=21amp;b=21 # asd.com/abc.xyz?a=1amp;c=2amp;a=12amp;d=21amp;b=21
Если вы хотите сохранить только последнее значение каждого параметра, чтобы избежать указания более одного значения для каждого параметра в URL-адресе, вы можете создать диктант, сопоставляющий параметры с их значениями:
from itertools import groupby from operator import itemgetter with open('txt', 'r'), open('output.txt', 'w') as in_file, out_file: for bareurl,g in groupby((line.split('?') for line in sorted(in_file)), key=itemgetter(0)): d = dict(e.split('=') for spliturl in g for e in spliturl[1].split('amp;')) out_file.write( ''.join([bareurl, '?', 'amp;'.join(f'{k}={v}' for k,v in d), 'n']) ) # OUTPUT: # asd.com/abc.xy?a=12amp;c=2amp;d=21amp;b=21 # asd.com/abc.xyz?a=12amp;c=2amp;d=21amp;b=21