Python:覆盖文本文件-字符串占位符

问题描述

如何使用(如果存在)字符串占位符在文本文件中进行写入? 我想编写一个文本文件,该文件跟踪自身写入了多少行。一旦行数更改,计数应相应更改。

这里是一个例子:

number_of_lines = 0

with open('./test.txt',"w") as out_file:
    out_file.write('number of elements in list: '+str(2)+'\n')
    out_file.write('element 1\n')
    out_file.write('element 2\n')

with open('./test.txt',"r+") as out_file:
    next(out_file)
    out_file.write('element 3\n')
    out_file.write('element 4\n') 
    out_file.write('element 5\n')
    out_file.write('element 6\n') 
    out_file.write('element 7\n')
    out_file.write('element 8\n') 
    out_file.write('element 9\n')
    out_file.write('element 10\n')    # Now 2 Digits '10'
    out_file.seek(0)
    for i in out_file:
        number_of_lines += 1
    
    out_file.seek(0)
    out_file.write('number of elements in list: '+str(number_of_lines-1)+'\n')

文本文件

number of elements in list: 10
lement 1
element 2
element 3
element 4
element 5
element 6
element 7
element 8
element 9
element 10

解决方法

由于.txt文件本身无法读取,因此您尝试执行的棘手部分是仅更新文件中的特定行,同时保留其余数据here的更多内容。

因此,一个简单的解决方案是定义一个函数来更新相关行,然后在我们对该文件进行每次修改后调用它。让我们做到这一点:

def update_line_count(filename):
    with open(filename,'r') as original:
        # Get the original file data so we can re-insert it later
        data = original.read()
    with open(filename,'w') as modified:
        # Remove the first line if it's already a line count
        if data.startswith('number of elements in list'):
            data = '\n'.join(data.split('\n')[1:])
        # Get the updated line count
        number_of_lines = len(data.split('\n'))-1
        updated = f'number of elements in list: {number_of_lines}\n{data}'
        modified.write(updated)

现在,我们可以在修改文件后立即调用它,它将更新第一行以包含正确的行数。

让我们看看它的作用:

my_file = './test.txt'

with open(my_file,"w") as file:
    file.write('element 1\n')
    file.write('element 2\n')

update_line_count(my_file)

现在,在test.txt内,我们有:

number of elements in list: 2
element 1
element 2

让我们修改和更新更多内容:

with open(my_file,"r+") as file:
    next(file)
    file.write('element 3\n')
    file.write('element 4\n') 
    file.write('element 5\n')
    file.write('element 6\n') 
    file.write('element 7\n')
    file.write('element 8\n') 
    file.write('element 9\n')
    file.write('element 10\n')
    file.write('element 100\n')
    file.write('element 1000?\n')

update_line_count(my_file)

浏览test.txt内:

number of elements in list: 12
element 1
element 2
element 3
element 4
element 5
element 6
element 7
element 8
element 9
element 10
element 100
element 1000?

万岁! :)