【问题标题】:Find a string in a file and replace the next lines在文件中查找字符串并替换下一行
【发布时间】:2018-02-12 00:51:30
【问题描述】:

我有一个看起来像这样的CSON (Coffeescript JSON) 文件:

'main key':

    subkey: 
        someKey: 'some value'
        someKey: 'some value'

    subkey:
        someKey: 'some value'
        someKey: 'some value'

    specialKey: [
        'special value X'
        'special value Y'
    ]

    subkey:
        someKey: 'some value'
        someKey: 'some value'
        someKey: 'some value'

#And the list goes on and on...

所以我想查找并定位 specialKey 并将 special value Xspecial value Y 替换为其他值,请记住,CSON 的性质是缩进敏感的。

我曾考虑从specialKey 获取行号并替换接下来的两个行号,但对于我来说,我一直无法找到在 Python 中按数字编辑特定行的方法。

(作为旁注,我知道pycson library,但除了单行JSON,我无法让它输出任何东西,我宁愿将它保留在CSON因为我想在长文件中保持可读性并且不想弄乱用户的原始文件。)

【问题讨论】:

    标签: python python-3.x cson


    【解决方案1】:

    好的,我再次回答了我自己的问题。它可能不是最有效或最优雅的,但它是:

    from shutil import move
    
    count = 0
    with open('fileInput.cson') as fileIn, open('fileInput.cson.tmp', 'w') as fileOut:
        for item in fileIn:
            if count == 1:
                item = "      \'NEW special value Y\'\n"
                count -= 1
            if count == 2:
                item = "      \'NEW special value X\'\n"
                count -= 1
    
            if item.strip().startswith('specialKey:'):
                count = 2
    
            fileOut.write(item)
    
    move('fileInput.cson.tmp', 'fileInput.cson')
    

    需要注意的几点:

    1. 我无法直接逐行编辑文件,因此它创建了一个辅助 tmp 文件,该文件是原始文件加上它所做的更改的结果,完成后它会替换原始文件,所以文件需要牢记权限。
    2. 它会循环遍历原始文件中的所有行,因此如果文件太大,可能会影响性能或执行时间。
    3. 正如问题中提到的,空格在CSON 中非常重要,就像在 Python 中一样,因此检查您要替换它们的空格是否与原始空格匹配非常重要

    如果您能想到任何更好的解决方案/改进方案,请告诉我 :) 我全神贯注(也许是眼睛)


    学分:

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2018-08-29
      相关资源
      最近更新 更多