#python #python-3.x
#питон #python-3.x
Вопрос:
У меня есть следующий текст:
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(MD5,SHA1)
WALLET_LOCATION=
(SOURCE=
(METHOD=FILE)
(METHOD_DATA=
(DIRECTORY=/oracle/.wallets)
)
)
SQLNET.WALLET_OVERRIDE=TRUE
и хотите получить это в результате:
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(MD5,SHA1)
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/oracle/.wallets)))
SQLNET.WALLET_OVERRIDE=TRUE
Какой наиболее эффективный способ сделать это с помощью родного Python (без дополнительных внешних пакетов)?
Могут быть и другие многострочные параметры. И я не знаю заранее, сколько скобок у них может быть.
Правка1. Мне не нужно точное решение. По крайней мере, просто алгоритм.
Комментарии:
1. Если у вас возникла конкретная проблема при самостоятельном решении этой проблемы, вы можете задать ее здесь с вашим кодом.
2. Мне нужен хотя бы способ эффективного решения этой задачи.
Ответ №1:
Один из способов, который вы можете сделать, это использовать номер строки для начала и конца, а затем объединить все строки между ними. Кстати, я сохранил ваш текст в файле, но вы также можете напрямую добавить его в код.
file1 = open('myfile.txt', 'r')
Lines = file1.readlines()
count = 0
lineNumStart, lineNumEnd = 1, 7
outStringJoined = ""
for line in Lines:
if count>=lineNumStart and count<lineNumEnd:
outStringJoined = line.strip()
else:
outStringJoined = line
count =1
print(outStringJoined)
Чтобы сделать его более гибким, вы можете использовать пару, такую как («(«, «)»). Если первый элемент пары найден, то код будет продолжать объединение до тех пор, пока не будет найдена соответствующая пара!
Комментарии:
1. Дело в том, что я заранее не знаю, где находится многострочная переменная (текст выше — это всего лишь небольшой фрагмент файла). Чтобы удалить все новые строки, я могу использовать регулярное выражение. Это не то, чего я хотел. Но в любом случае спасибо, что уделили мне время.
Ответ №2:
with open('sqlnet.ora', 'r') as file:
sqlnetora = file.read()
sqlnetora = re.sub(r' ', '', re.sub(r'n ', 'n', sqlnetora))
.replace(' n','n')
text_list = sqlnetora.splitlines()
is_mvar = False # flag if we are working with multiline parameter
oneliner = [] # list with one-line parameters
mvar = [] # list for multiline parameter
for line in text_list:
po = line.count('(')
pc = line.count(')')
# this is not multiline parameter
if not is_mvar:
if line[-1:] == ')' and po == pc:
oneliner.append(line)
elif line[-1:] != '=' and po == pc:
oneliner.append(line)
# we've found start of multiline parameter
else:
mpo = line.count('(')
mpc = line.count(')')
is_mvar = True
mvar.append(line)
# this is multiline parameter
else:
mpo = po
mpc = pc
# if this is last line for multiline parameter?
if mpo == mpc:
mvar.append(line)
oneliner.append(('').join(mvar))
mvar.clear()
is_mvar = False
# this is not last line of multiline parameter
else:
mvar.append(line)
print(*oneliner, sep='n')