在文件中查找字符串并替换下一行

Find a string in a file and replace the next lines

我有一个 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 but I haven't been able to get it to output anything other than single line JSON,我宁愿将它保留在 CSON 中,因为我想在一个长文件中保持可读性并且不会想弄乱用户的原始文件。)

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

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 中一样非常重要,因此检查您要替换的空格是否与原始空格相匹配至关重要

如果你能想到更好的solution/improvements,请告诉我:)我洗耳恭听(也许是眼睛)


学分:

  • Force Overwrite in Os.Rename