【问题标题】:Python make oneliner for multiline text in sqlnet.oraPython为sqlnet.ora中的多行文本制作oneliner
【发布时间】:2020-09-04 12:38:37
【问题描述】:

我有以下文字:

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。我不需要确切的解决方案。至少只是一个算法。

【问题讨论】:

  • 如果您在自己解决此问题时遇到特定问题,可以在此处使用您的代码询问。
  • 我至少需要一种有效解决此任务的方法。

标签: python python-3.x


【解决方案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)

为使其更灵活,可以使用 ("(", ")") 之类的对。如果找到该对的第一个元素,则代码将继续连接,直到找到匹配的对!

【讨论】:

  • 问题是我事先不知道多行变量的位置(上面的文字只是文件的一小部分)。要删除所有新行,我可以使用正则表达式。那不是我想要的。但无论如何,感谢您的宝贵时间。
【解决方案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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 2018-03-22
    相关资源
    最近更新 更多