美文网首页
python实现在指定文件指定位置插入字符

python实现在指定文件指定位置插入字符

作者: RantLing | 来源:发表于2019-07-24 10:47 被阅读0次

    1. 场景

    生产环境需要对大量的json文件进行写操作,在指定节点中插入一个属性。如下:

    {
        "dataSources":{
            "test_dataSource_hod":{
                "spec":{
                    "dataSchema":{
                        "dataSource":"test_dataSource_hod",
                        "parser":{
                            "type":"string",
                            "parseSpec":{
                                "timestampSpec":{
                                    "column":"timestamp",
                                    "format":"yyyy-MM-dd HH:mm:ss"
                                },
                                "dimensionsSpec":{
                                    "dimensions":[
                                        "method",
                                        "key"
                                    ]
                                },
                                "format":"json"
                            }
                        },
                        "granularitySpec":{
                            "type":"uniform",
                            "segmentGranularity":"hour",
                            "queryGranularity":"none"
                        },
                        "metricsSpec":[
                            {
                                "name":"count",
                                "type":"count"
                            },
                            {
                                "name":"call_count",
                                "type":"longSum",
                                "fieldName":"call_count"
                            },
                            {
                                "name":"succ_count",
                                "type":"longSum",
                                "fieldName":"succ_count"
                            },
                            {
                                "name":"fail_count",
                                "type":"longSum",
                                "fieldName":"fail_count"
                            }
                        ]
                    },
                    "ioConfig":{
                        "type":"realtime"
                    },
                    "tuningConfig":{
                        "type":"realtime",
                        "maxRowsInMemory":"100000",
                        "intermediatePersistPeriod":"PT10M",
                        "windowPeriod":"PT10M"
                    }
                },
                "properties":{
                    "task.partitions":"1",
                    "task.replicants":"1",
                    "topicPattern":"test_topic"
                }
            }
        },
        "properties":{
            "zookeeper.connect":"zookeeper.com:2015",
            "druid.discovery.curator.path":"/druid/discovery",
            "druid.selectors.indexing.serviceName":"druid/overlord",
            "commit.periodMillis":"12500",
            "consumer.numThreads":"1",
            "kafka.zookeeper.connect":"kafkaka.com:2181,kafka.com:2181,kafka.com:2181",
            "kafka.group.id":"test_dataSource_hod_dd"
        }
    }
    

    需要在最后的properties节点中添加一个"druidBeam.randomizeTaskId":"true"属性。

    2. 思路

    大概的思路如下:

    1. 扫描文件夹下所有需要更改的文件
    2. 在文件中确认需要更改的位置
    3. 插入新的字符

    我觉得稍微有点难的地方是在确认插入位置的地方。我们知道的是"druid.selectors.indexing.serviceName":"druid/overlord",这个东西肯定在这个节点中,那我只要能找到这个东西,然后在他的后面插入就OK了。
    好了,思路已经有了,写代码吧。

    #!/usr/bin/python
    # coding:utf-8
    
    import os
    
    
    old_string = '"druid/overlord"'
    new_string = ('"druid/overlord",' +
                  '\n        ' +
                  '"druidBeam.randomizeTaskId":"true",')
    
    
    def insertrandomproperty(file_name):
        if '.json' in file_name:
            with open(file, 'r') as oldfile:
                content = oldfile.read()
                checkandinsert(content, file)
    
        else:
            pass
    
    
    def checkandinsert(content, file):
        if 'druidBeam.randomizeTaskId' not in content:
           # to avoid ^M appear in the new file because of different os
           # we replace \r  with '' 
            new_content = content.replace(old_string, new_string).replace('\r', '')
    
            with open(file, 'w') as newfile:
                newfile.write(new_content)
        else:
            pass
    
    
    if __name__ == '__main__':
        files = os.listdir('/home/tranquility/conf/service_bak')
        os.chdir('/home/tranquility/conf/service_bak')
        for file in files:
            insertrandomproperty(file)
    
    

    就是在内存中更新内容,然后重新写回到文件中。代码只是粗略的表达了思路,可以根据需求继续修改优化。

    相关文章

      网友评论

          本文标题:python实现在指定文件指定位置插入字符

          本文链接:https://www.haomeiwen.com/subject/plhfqctx.html