2014-10-24 4 views
0

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

Если мы имеем пример:

[Friday 17/10/2014 @ 07:30:55] The user user01 | account01 | namename1 has been granted access. 
[Friday 17/10/2014 @ 07:30:57] The user user two | account_two | name2 has been granted access. 
[Friday 17/10/2014 @ 07:30:59] The user user_three | account_ | name3 here3 has been granted access. 
[Friday 17/10/2014 @ 07:31:41] The user user01 | account01 | namename1 has been granted access. 

Я хочу это в основном найти информацию о счете между двумя трубами | и вычистить трубы и пустое пространство, так что будет выводить список в текстовый файл с только следующее, после того, как она прошла через и удалить все дубликаты, так что строго чистый список

account01 
account_two 
account_ 

Один чек он должен сделать, это убедиться, что он получает только информацию о счете, если строка содержит фразу has been granted access., так как данные могут выглядеть следующим образом:

[Friday 17/10/2014 @ 07:30:55] The user user01 | account01 | namename1 has been granted access. 
[Friday 17/10/2014 @ 07:30:57] The user user two | account_two | name2 has been granted access. 
[Friday 17/10/2014 @ 07:30:59] Details Granted | user two | access number
[Friday 17/10/2014 @ 07:30:59] The user user_three | account_ | name3 here3 has been granted access. 
[Friday 17/10/2014 @ 07:31:41] The user user01 | account01 | namename1 has been granted access. 

Я не хочу, чтобы получить информацию об учетной записи user two из строки 3 этого примера.

Может ли кто-нибудь помочь с некоторыми примерами битов кода? Это будет высоко ценится.

ответ

0

я полностью игнорировать раскол ... но вот полностью рабочая версия, основанная на использовании разделения:

расщепляется | и выбирает вторую часть раскола, тогда удаляет все пробелы, он затем производит AccountList проверив, если учетная запись не в списке таким образом, он удаляет дубликаты

Наконец, но не в последнюю очередь это затем выводит все счета в output.txt в

accountlist = [] 
with open('mydatafile.txt', 'r') as infile: 
    for line in infile: 
     if "has been granted access." in line: 
      if line.strip().split('|')[1].strip(" ") not in accountlist: 
       accountlist.append(line.strip().split('|')[1].strip(" ")) 
    print accountlist 

    with open('output.txt', 'w') as outfile: 
     for account in accountlist: 
      outfile.write("%s\n" % account) 
1
def get_granted_accounts(filename): 
    with open(filename) as f: 
     return set(
       s.split('|')[1].strip() 
       for s in f.readlines() 
       if "has been granted access" in s) 

Этот фрагмент кода будет работать с некоторой оговоркой:

  • трубы не может произойти в первом или втором поле (цит, сбежавшего)
  • «был предоставлен доступ» должен появиться только в ожидаемое поле (не в качестве имени учетной записи, например)
+2

«удалены все дубликаты» отсутствует. Должен ли вызов set() – enthus1ast

+0

Правильно, я изменил код, чтобы соответствовать наблюдению @DavidosKrausos – Teudimundo

2
>>> granted_accounts = [line.split('|')[1].strip() for line in open('file.txt') if 'has been granted access' in line] 
>>> print(granted_accounts) 
['account01', 'account_two', 'account_', 'account01'] 

Если вы хотите, чтобы быть в состоянии выполнить его в командной строке, просто положить две строки с притон в .py файл как так (search.py):

#!/usr/bin/env python 
granted_accounts = [line.split('|')[1].strip() for line in open('file.txt') if 'has been granted access' in line] 
print(granted_accounts) 

И работать так:

$ python search.py 

или:

$ chmod +x search.py 
$ ./search.py 

Если у вас есть много счетов, вы можете распечатать каждую учетную запись только один раз и на отдельной строке:

>>> granted_accounts = [line.split('|')[1].strip() for line in open('file.txt') if 'has been granted access' in line] 
>>> print('\n'.join(sorted(set(granted_accounts)))) 
account01 
account_ 
account_two 
+0

, почему нам нужно изменить сценарий thed как исполняемый файл? –

+0

@AvinashRaj: если вы прочли следующую строку, вы увидите, что ее можно выполнить без необходимости вручную выбирать интерпретатор. Если вы используете MinGW под Windows, вам это не понадобится. –

+1

Но ваш первый код отображает строку вместо упомянутого вывода. –

Смежные вопросы