python写文件追加 按行追加_python 追加写入

python写文件追加 按行追加_python 追加写入匹配文本并追加内容

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

问题描述

Python匹配文本并在其上一行追加文本

test.txt

a
b
c
d
e

1.读进列表后覆盖原文件

def match_then_insert(filename, match, content):
    """匹配后在该行追加 :param filename: 要操作的文件 :param match: 匹配内容 :param content: 追加内容 """
    lines = open(filename).read().splitlines()
    index = lines.index(match)
    lines.insert(index, content)
    open(filename, mode='w').write('\n'.join(lines))


match_then_insert('test.txt', match='c', content='123')

效果

a
b
123
c
d
e

2.FileInput类

from fileinput import FileInput


def match_then_insert(filename, match, content):
    """匹配后在该行追加 :param filename: 要操作的文件 :param match: 匹配内容 :param content: 追加内容 """
    for line in FileInput(filename, inplace=True):  # 原地过滤
        if match in line:
            line = content + '\n' + line
        print(line, end='')  # 输出重定向到原文件


match_then_insert('test.txt', match='c', content='123')

3.seek

def match_then_insert(filename, match, content):
    """匹配后在该行追加 :param filename: 要操作的文件 :param match: 匹配内容 :param content: 追加内容 """
    with open(filename, mode='rb+') as f:
        while True:
            try:
                line = f.readline()  # 逐行读取
            except IndexError:  # 超出范围则退出
                break
            line_str = line.decode().splitlines()[0]
            if line_str == match:
                f.seek(-len(line), 1)  # 光标移动到上一行
                rest = f.read()  # 读取余下内容
                f.seek(-len(rest), 1)  # 光标移动回原位置
                f.truncate()  # 删除余下内容
                content = content + '\n'
                f.write(content.encode())  # 插入指定内容
                f.write(rest)  # 还原余下内容
                break


match_then_insert('test.txt', match='c', content='123')

对比

方案 耗时/s
读进列表后覆盖原文件 54.42
FileInput类 121.59
seek 3.53
from timeit import timeit
from fileinput import FileInput


def init_txt():
    open('test.txt', mode='w').write('\n'.join(['a', 'b', 'c', 'd', 'e']))


def f1(filename='test.txt', match='c', content='123'):
    lines = open(filename).read().splitlines()
    index = lines.index(match)
    lines.insert(index, content)
    open(filename, mode='w').write('\n'.join(lines))


def f2(filename='test.txt', match='c', content='123'):
    for line in FileInput(filename, inplace=True):
        if match in line:
            line = content + '\n' + line
        print(line, end='')


def f3(filename='test.txt', match='c', content='123'):
    with open(filename, mode='rb+') as f:
        while True:
            try:
                line = f.readline()
            except IndexError:
                break
            line_str = line.decode().splitlines()[0]
            if line_str == match:
                f.seek(-len(line), 1)
                rest = f.read()
                f.seek(-len(rest), 1)
                f.truncate()
                content = content + '\n'
                f.write(content.encode())
                f.write(rest)
                break


init_txt()
print(timeit(f1, number=1000))
init_txt()
print(timeit(f2, number=1000))
init_txt()
print(timeit(f3, number=1000))

遇到的坑

报错可试试在文件头部添加

# -*- coding: utf-8 -*-

或指定 encoding='utf-8'

参考文献

  1. open — Python 文档
  2. Python3 open() 函数 | 菜鸟教程
  3. open文件操作之mode模式剖析
  4. Python文件打开方式详解——a、a+、r+、w+、rb、rt
  5. python 文件混合读写模式 mode=‘r+’
  6. python下在txt指定行追加文本
  7. 如何流式读取数G超大文件
  8. Python3 seek()中间追加失败
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183397.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSL和SSH有什么区别

    SSL和SSH有什么区别

    2021年10月8日
    42
  • idea 激活码【注册码】

    idea 激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    72
  • latex中长公式换行,很好的办法

    latex中长公式换行,很好的办法今天在编辑公式时,有一个公式很长,写到一行就出去了。当时之前换行都是方程组或者在括号完之后换,都没有问题。但是今天我也换行的是在括号中间断开。这样出现问题,编辑的时候会出错误提醒。上网查了一些论坛,也有人和我一样的问题,但是都没有解决方案。自己试了好几种方法,又和办公室的其他人讨论了一下,终于找办法了。比较简单的情况:方程组code:\begin{equation}\b

    2022年5月31日
    54
  • 【Cutout】《Improved Regularization of Convolutional Neural Networks with Cutout》[通俗易懂]

    【Cutout】《Improved Regularization of Convolutional Neural Networks with Cutout》[通俗易懂]arXiv-2017随着深度学习技术的发展,CNN在很多计算机视觉任务中崭露头角,但increasedrepresentationalpoweralsocomesincreasedprobabilityofoverfitting,leadingtopoorgeneralization.为提升模型的泛化性能,模拟objectocclusion,作者提出了Cutout数据增强的方法——randomlymaskingoutsquareregionsofinput

    2022年9月24日
    2
  • Ubuntu下DNS服务器的配置

    Ubuntu下DNS服务器的配置Ubuntu下DNS服务器的配置——Bind9发表于2017/6/1214:35:49 1220人阅读分类:ubuntu服务器DNS

    2022年5月30日
    35
  • 办公技巧 SecureCRTPortable如何设置自动保存日志[通俗易懂]

    办公技巧 SecureCRTPortable如何设置自动保存日志[通俗易懂]1.选项-全局选项-常规-默认回话-编辑默认设置-日志文件2.将日志文件名改为:路径+%H_%M%D_%h%m%s3.在连接时自动加入:[%Y%M%D_%h:%m:%s]4.在每行自动加入:[%h:%m:%s]5.保存,选择所有回话,即可在下一次连接时自动保存日志文件显示项可选:%H:主机名%S:串口名%Y:年%M:月%D:日%h:时%m:分%s:秒…

    2022年6月4日
    108

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号