Я пытаюсь извлечь имена пользователей из файла конфигурации в список и сравнить имена пользователей с другим безопасным списком имен пользователей. Файл конфигурации выглядит следующим образом:
username Hilton privilege 15 password 0 $xxxxxxxxxxxxx
username gooduser password 0 $xxxxxxxxxxxxx
username jason secret 5 $xxxxxxxxxxxxx
Проблема с выводом не единого списка! (каждый пользователь находится в списке)
['Hilton']
['gooduser']
['jason']
Я читаю файл в один список. Затем нашел позицию «имя пользователя» и использовал перечисление, чтобы найти позицию
the_list = []
with open('config_file.txt', "r") as f:
the_list = f.read().split()
print(the_list)
find_keyword = 'username'
secure_users = ['jason','test','admin']
for i,x in enumerate(the_list): # search in the list
if x=='username': # for this keyword 'username'
pos = i + 1 # position of every username
print(the_list[pos].split()) # print all users.
#Compare secure_users[] vs the_list[] here
ожидаемый результат — это список вроде >> ['Hilton','gooduser','jason']
Чтобы я мог сравнить его со списком secure_users
Всегда ли имя пользователя находится на второй позиции в вашем файле конфигурации? Сразу после ключевого слова username?
Да всегда Сразу после имени пользователя ключевого слова






Сделал некоторые изменения в вашем коде,
the_list = []
with open('config_file.txt', "r") as f:
the_list = f.read().split()
print(the_list)
find_keyword = 'username'
secure_users = ['jason','test','admin']
users_list = []
for i,x in enumerate(the_list): # search in the list
if x=='username': # for this keyword 'username'
pos = i + 1 # position of every username
users_list.append(the_list[pos].split()[0]) # print all users
print(users_list)
Выход:
['username', 'Hilton', 'privilege', '15', 'password', '0', '$xxxxxxxxxxxxx', 'username', 'gooduser', 'password', '0', '$xxxxxxxxxxxxx', 'username', 'jason', 'secret', '5', '$xxxxxxxxxxxxx']
['Hilton', 'gooduser', 'jason']
Другое решение: (лучший способ)
with open('config_file.txt', 'r') as f:
data = f.read().split()
user_names = [data[i+1] for i,line in enumerate(data) if 'username' in line ]
Выход:
['Hilton', 'gooduser', 'jason']
Попробуйте следующее:
usernames = []
secure_users = ['jason','test','admin']
with open('config_file.txt', "r") as f:
for line in f:
usernames.append(line.split()[1])
print([user for user in secure_users if user in usernames])
Это не желаемый результат.
Использование регулярного выражения.
Бывший:
import re
find_keyword = 'username'
the_list = []
with open('config_file.txt') as f:
for line in f:
m = re.search(r"\b{}\b \b(.*?)\b ".format(find_keyword), line.strip()) #Search for key and word after that.
if m:
the_list.append(m.group(1))
print(the_list)# ->['Hilton', 'gooduser', 'jason']
добавьте список с именем diff в свой код, например:
diff = []
затем просто добавьте ниже 2 строки после строки кода print(the_list[pos].split()):
if the_list[pos] not in secure_users:
diff.append(the_list[pos])
затем напечатайте diff, чтобы увидеть единый список:
print(diff)
Не могли бы вы сделать правильный отступ в коде