首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用startswith函数生成类似于diff工具中的输出?

如何使用startswith函数生成类似于diff工具中的输出?
EN

Stack Overflow用户
提问于 2014-03-25 18:48:44
回答 2查看 147关注 0票数 0

请帮我解决(我认为很有趣)算法问题。我今天花了一整天来解决这个问题。这是我的代码:

代码语言:javascript
复制
rman_config = ('''CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
''')

rman_new_parameters = [('RETENTION POLICY', 'TO RECOVERY WINDOW OF 2 DAYS'),
                       ('CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE', 'DISK TO controlfile_%F'),
                       ('CONTROLFILE AUTOBACKUP', 'ON'),
                       ('DEVICE TYPE', 'DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET')]

tuple_to_search = tuple([i[0] for i in rman_new_parameters])

for line in rman_config.splitlines():
    if line.startswith(tuple_to_search, 10):
        print('-  ' + line)
        print('+  CONFIGURE ' + '[parameter] ' + '[new value]' + ';')
    else:
        print('   ' + line)

其中:

  • rman_config -具有默认配置的变量
  • rman_new_parameters -新参数按随机顺序覆盖默认值:
    • 元组中的第一个元素是一个参数(即CONTROLFILE AUTOBACKUP)。
    • 元组中的第二个元素是一个新值(即ON)。

到目前为止,我有这样的输出:

代码语言:javascript
复制
-  CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
+  CONFIGURE [parameter] [new value];
   CONFIGURE BACKUP OPTIMIZATION OFF; # default
   CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
-  CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
+  CONFIGURE [parameter] [new value];
-  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
+  CONFIGURE [parameter] [new value];
-  CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
+  CONFIGURE [parameter] [new value];
   CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

但是我想要这个(就像在Diff中):

代码语言:javascript
复制
-  CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
+  CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;
   CONFIGURE BACKUP OPTIMIZATION OFF; # default
   CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
-  CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
+  CONFIGURE CONTROLFILE AUTOBACKUP ON;
-  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
+  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO cf_%F;
-  CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
+  CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
   CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default 

startswith函数很好,但它不告诉我识别哪个元组(只返回真假)。我使用上面的代码的问题是如何映射下一行:

代码语言:javascript
复制
if line.startswith(tuple_to_search, 10):

如果它是真到rman_new_parameters 列表.

我不知道怎么解决这个问题?我会非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2014-03-25 18:55:58

代码语言:javascript
复制
for line in rman_config.splitlines():
    for params in rman_new_parameters:
        if line.startswith(params[0], 10):
            print('-  {}'.format(line))
            print('+  CONFIGURE {} {}'.format(*params))
            break
    else:
        print('   {}'.format(line))

基本上,我没有将元组传递给.startswith,只是在一个循环中逐个测试。

还有,else

票数 2
EN

Stack Overflow用户

发布于 2014-03-28 14:59:01

我不知道你想做什么。但不管怎样,我写的代码。看看这个答案是否符合你的问题。主要区别在于您的if-else块变成了try-except块。重点是index函数,它返回参数在tuple_to_search中第一次出现的位置。我假设rman_new_parameters中所有参数的值都与rman_config不同。

代码语言:javascript
复制
rman_config = ('''CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
''')

rman_new_parameters = [('RETENTION POLICY', 'TO RECOVERY WINDOW OF 2 DAYS'),
                       ('CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE', 'DISK TO controlfile_%F'),
                       ('CONTROLFILE AUTOBACKUP', 'ON'),
                       ('DEVICE TYPE', 'DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET')]

tuple_to_search = [i[0] for i in rman_new_parameters]

for line in rman_config.splitlines():
    try:
        index = [line.startswith(tup, 10) for tup in tuple_to_search].index(True)
        print('-  ' + line)
        print('+  CONFIGURE ' + " ".join(rman_new_parameters[index]) + ';')
        #Add these if you don't need to check parameter once matched.
        #del rman_new_parameters[index]
        #del tuple_to_search[index]
    except:
        print('   ' + line)

产出:

代码语言:javascript
复制
-  CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
+  CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;
   CONFIGURE BACKUP OPTIMIZATION OFF; # default
   CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
-  CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
+  CONFIGURE CONTROLFILE AUTOBACKUP ON;
-  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
+  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO controlfile_%F;
-  CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
+  CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
   CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

P.S.

我的输出与您想要的输出略有不同(2行不同)。我也不知道原因。因此,请确保这是您想要的输出。

你的:

代码语言:javascript
复制
...
+  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO cf_%F;
...
   CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default 

我的:

代码语言:javascript
复制
...
+  CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO controlfile_%F;
...
   CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
                                                                        ^
                                                                    no space here
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22643688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档