Нужно добавить часть кода

Tom Nethan

Новичок
Пользователь
Апр 21, 2020
12
0
1
Есть код для Парсинга текстовых документов по типу
Key Val
При вводе в консоль
Get param key
Программа отвечает:
Key : Val
Нужно добавить часть кода чтобы в случае если строка имеет виды:
Key Val #comment (1)
Key#comment (2)
Программа работала корректно, т е: в случае мы запрашиваем пример (1) программа сейчас выдаёт
Key : Val #comment, а должна выдавать просто key : Val
В случае запроса примера (2) программа должна выдавать «данные отсутствуют», а она выдаёт «ключ отсутствует»

Код:
data = {}

with open('conf') as f:
    for line in f:
        line = line.strip('\n')
        if line.startswith('#') or line.startswith(';'):
            continue
        elif ' ' in line:
            key, value = line.split(' ', 1)
            data[key] = value
        else:
            data[line] = None


while True:
    line = input()
    if line.startswith('get param '):
        key = line[10:]
        try:
            print(key, ':', data[key] or '(данные отсутствуют)')
        except KeyError:
            print('Ключ отсутствует')
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В случае запроса примера (2) программа должна выдавать «данные отсутствуют», а она выдаёт «ключ отсутствует»
Это происходит потому что data[key] при несуществующем ключе вызывает исключение KeyError, и выводится сообщение из except-ветки. Чтобы исправить нужно заменить data[key] на data.get(key)
 

Tom Nethan

Новичок
Пользователь
Апр 21, 2020
12
0
1
Это происходит потому что data[key] при несуществующем ключе вызывает исключение KeyError, и выводится сообщение из except-ветки. Чтобы исправить нужно заменить data[key] на data.get(key)
спасибо, второй случай теперь работает как нужно, не подскажите, пожалуйста, как теперь пофиксить первый?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
спасибо, второй случай теперь работает как нужно, не подскажите, пожалуйста, как теперь пофиксить первый?
Как я понял нужно просто срезать часть строки после #. Замените этот код:
Python:
try:
    print(key, ':', data[key] or '(данные отсутствуют)')
except KeyError:
    print('Ключ отсутствует')
на такой:
Python:
value =  data.get(key)
if value:
    print(key, ':', value.split('#')[0])
else:
    print('(данные отсутствуют)')
 

Tom Nethan

Новичок
Пользователь
Апр 21, 2020
12
0
1
Как я понял нужно просто срезать часть строки после #. Замените этот код:
Python:
try:
    print(key, ':', data[key] or '(данные отсутствуют)')
except KeyError:
    print('Ключ отсутствует')
на такой:
Python:
value =  data.get(key)
if value:
    print(key, ':', value.split('#')[0])
else:
    print('(данные отсутствуют)')
все заработало как нужно, спасибо!
 

Tom Nethan

Новичок
Пользователь
Апр 21, 2020
12
0
1
Как я понял нужно просто срезать часть строки после #. Замените этот код:
Python:
try:
    print(key, ':', data[key] or '(данные отсутствуют)')
except KeyError:
    print('Ключ отсутствует')
на такой:
Python:
value =  data.get(key)
if value:
    print(key, ':', value.split('#')[0])
else:
    print('(данные отсутствуют)')


все было хорошо, но появился один нюанс, теперь программа выдает "данные отсутствуют" и в случае если нет value (это правильно) но и в случае если мы вводим get param key(которого нет в нашем текстовике) он теперь тоже выдает "данные отсутствуют" а должна выдавать "ключ отсутствует"
подскажите, пожалуйста, как исправить.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
все было хорошо, но появился один нюанс, теперь программа выдает "данные отсутствуют" и в случае если нет value (это правильно) но и в случае если мы вводим get param key(которого нет в нашем текстовике) он теперь тоже выдает "данные отсутствуют" а должна выдавать "ключ отсутствует"
подскажите, пожалуйста, как исправить.
Python:
value = None
try:
    value = data[key]
except KeyError:
    print('(ключ отсутствует)')
else:
    if value:
        print(key, ':', value.split('#')[0])
    else:
        print('(данные отсутствуют)')
 

Tom Nethan

Новичок
Пользователь
Апр 21, 2020
12
0
1
Python:
value = None
try:
    value = data[key]
except KeyError:
    print('(ключ отсутствует)')
else:
    if value:
        print(key, ':', value.split('#')[0])
    else:
        print('(данные отсутствуют)')

все равно в случае если вводим ключ в надежде получить "ключ отсутствует" проходит мимо ветки исключения и выдает "данные отсутствуют"
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
все равно в случае если вводим ключ в надежде получить "ключ отсутствует" проходит мимо ветки исключения и выдает "данные отсутствуют"
Покажите свой код. Где-то у вас ошибка. Потому-что код который я написал выше работает. Вот пример с данными:
Python:
data = {1: '111', 2: ''}
key = 3
value = None
try:
    value = data[key]
except KeyError:
    print('(ключ отсутствует)') # этот print сработает
else:
    if value:
        print(key, ':', value.split('#')[0])
    else:
        print('(данные отсутствуют)')
 

Tom Nethan

Новичок
Пользователь
Апр 21, 2020
12
0
1
Покажите свой код. Где-то у вас ошибка. Потому-что код который я написал выше работает. Вот пример с данными:
Python:
data = {1: '111', 2: ''}
key = 3
value = None
try:
    value = data[key]
except KeyError:
    print('(ключ отсутствует)') # этот print сработает
else:
    if value:
        print(key, ':', value.split('#')[0])
    else:
        print('(данные отсутствуют)')

Код:
file = input("Введите расположение файла: ")
try:
    config = open(file, 'r')
    data = {}
except Exception:
    print("File {" + file + "} is not exist")
    exit(0)

for line in config:
    line = line.strip('\n')
    if line.startswith('#') or line.startswith(';'):
        continue
    elif ' ' in line:
        key, value = line.split(' ', 1)
        data[key] = value
    else:
        data[line] = None


while True:
    line = input()
    if line.startswith('get param '):
        key = line[10:]
        value = None
        try:
            value = data[key]
        except KeyError:
            print('(ключ отсутствует)')
        else:
            if value:
                print(key, ':', value.split('#')[0])
            else:
                print('(данные отсутствуют)')

    flag = True
    r = ''
    while flag:
        r = input("хотите продолжить? (y/n)")
        if not (r == 'n' or r == 'y'):
          continue
        else:
            break
    if r == 'n':
        break
    if r == 'y':
        continue
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Протестировал ваш код с таким файлом:
Код:
1 53535
2 3535355
3
4 464464#543535353
;46464646
#test
Все работает. Если ввести
get param 10 - выдаст ключ отсутствует,
get param 3 - данные отсутствуют,
get param 4 - 4 : 464464
Покажите свой файл, который выдает ошибку. У меня выдает все корректно.
 

Tom Nethan

Новичок
Пользователь
Апр 21, 2020
12
0
1
Протестировал ваш код с таким файлом:
Код:
1 53535
2 3535355
3
4 464464#543535353
;46464646
#test
Все работает. Если ввести
get param 10 - выдаст ключ отсутствует,
get param 3 - данные отсутствуют,
get param 4 - 4 : 464464
Покажите свой файл, который выдает ошибку. У меня выдает все корректно.

##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server. #
# #
# This configuration can be used by multiple #
# clients, however each client should have #
# its own cert and key files. #
# #
# On Windows, you might want to rename this #
# file so it has a .ovpn extension #
##############################################

# Specify that we are a client and that we
# will be pulling certain config file directives
# from the server.
client#testcomm

# Use the same setting as you are using on
# the server.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun #testcomm

# Windows needs the TAP-Win32 adapter name
# from the Network Connections panel
# if you have more than one. On XP SP2,
# you may need to disable the firewall
# for the TAP adapter.
;dev-node MyTap

# Are we connecting to a TCP or
# UDP server? Use the same setting as
# on the server.
;proto tcp
proto udp

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote 85.143.213.73 1194
;remote my-server-2 1194

# Choose a random host from the remote
# list for load-balancing. Otherwise
# try hosts in the order specified.
;remote-random

# Keep trying indefinitely to resolve the
# host name of the OpenVPN server. Very useful
# on machines which are not permanently connected
# to the internet such as laptops.
resolv-retry infinite

# Most clients don't need to bind to
# a specific local port number.
nobind

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

# Try to preserve some state across restarts.
persist-key
persist-tun

# If you are connecting through an
# HTTP proxy to reach the actual OpenVPN
# server, put the proxy server/IP and
# port number here. See the man page
# if your proxy server requires
# authentication.
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]

# Wireless networks often produce a lot
# of duplicate packets. Set this flag
# to silence duplicate packet warnings.
;mute-replay-warnings

# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
# ca ca.crt
# cert client.crt
# key client.key

# Verify server certificate by checking that the
# certicate has the correct key usage set.
# This is an important precaution to protect against
# a potential attack discussed here:
# http://openvpn.net/howto.html#mitm
#
# To use this feature, you will need to generate
# your server certificates with the keyUsage set to
# digitalSignature, keyEncipherment
# and the extendedKeyUsage to
# serverAuth
# EasyRSA can do this for you.
remote-cert-tls server

# If a tls-auth key is used on the server
# then every client must also have the key.
tls-auth ta.key 1
key-direction 1

# Select a cryptographic cipher.
# If the cipher option is used on the server
# then you must also specify it here.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher AES-256-CBC
auth SHA256

# Enable compression on the VPN link.
# Don't enable this unless it is also
# enabled in the server config file.
#comp-lzo

# Set log file verbosity.
verb 3

# Silence repeating messages
;mute 20

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
И с каким ключом ошибка?
Попробовал:
get param dev - dev: tun
get param test - (ключ отсутствует)
get param nobind - (данные отсутствуют)
все работает
 

Tom Nethan

Новичок
Пользователь
Апр 21, 2020
12
0
1
И с каким ключом ошибка?
Попробовал:
get param dev - dev: tun
get param test - (ключ отсутствует)
get param nobind - (данные отсутствуют)
все работает
на самом деле я уже запутался в файлах, сейчас разобрался, да этот момент решен, но вернулась проблема которая была изначально, если добавить, допустим, к client комментарий, будет client#comm. теперь программа из-за комментария не распознает клиент, и пишет "ключ отсутствует" а должно "данные отсутствуют"
p.s. огромное спасибо что помогаете, просто я действительно уже запутался, не могу понять как сделать чтобы все работало как нужно
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
на самом деле я уже запутался в файлах, сейчас разобрался, да этот момент решен, но вернулась проблема которая была изначально, если добавить, допустим, к client комментарий, будет client#comm. теперь программа из-за комментария не распознает клиент, и пишет "ключ отсутствует" а должно "данные отсутствуют"
p.s. огромное спасибо что помогаете, просто я действительно уже запутался, не могу понять как сделать чтобы все работало как нужно
Я же приводил подобный пример - все работает:
get param dev - dev: tun полная строка с комментарием dev tun #testcomm. Ключ - dev, значение tun #testcomm, выдает только dev: tun
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Попробовал на строке client#testcomm - выдает (данные отсутствуют)
 

Форум IT Специалистов