【问题标题】:Python: overwrite text file - string placeholderPython:覆盖文本文件 - 字符串占位符
【发布时间】:2021-01-16 22:43:42
【问题描述】:

如何使用(如果存在)字符串占位符在文本文件中写入? 我想写一个文本文件,它会跟踪自己写了多少行。只要行数发生变化,计数就会相应变化。

这是一个例子:

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

【问题讨论】:

  • 使用列表并加入。在这里,您事先知道长度。
  • 不明白你的意思。我需要这个文本文件作为日志文件

标签: python string file overwrite


【解决方案1】:

由于.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?

万岁! :)

【讨论】:

  • 非常感谢,这是一个完美的解决方案!不幸的是,我不允许投票。
  • 乐于助人!绝对不需要投票,但是,任何人都可以选择答案,这对于将来有类似问题的用户来说会很棒:) @thommybee
  • 没错!你能解释我两件事吗?为什么我们必须将 len(data.split('\n')) 减 1 才能得到行数?是因为末尾有一个空行('\n)吗? 'f' 代表什么:更新 = f'列表中的元素数:...... @pitamer
  • len(data.split('\n')) 计算文件中的所有行包括第一行,它只应该进行计数。如果您想将其包含在计数中,可以删除-1。至于神秘的f,这是一个Literal String Interpolation,俗称f-string。这是一种格式化字符串的优雅方式。假设我们有age = 25,那么f'I am {age}''I am ' + str(age) 更优雅。至于在 Stack Overflow 上接受答案,可以通过点击答案上的“V”图标来完成,就在投票的下方:)
猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2018-04-15
相关资源
最近更新 更多