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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java依赖jar包的方式_java打包命令

    java依赖jar包的方式_java打包命令大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的mainclass作为你这个jar包的程序入口。具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。比如有个叫做test.jar的jar包,里面有一个拥有main函数的mainclass:test.someClassName。我们就只要在MANIFEST.MF里面添加如下一句话:…

    2022年9月1日
    1
  • 60道计算机网络面试题(附答案,背诵版)

    60道计算机网络面试题(附答案,背诵版)在大概三个月前,我在我网站就整理了计算机网络的面试题了,不过那时候才整理了20道核心的,大概过了两个月,我花了大半天去找计算机网络的面试题,因为20道肯定不够,于是我整理到了42道。不过最近我不是在整理各个公司的面经嘛?发现42道还是漏掉了不少,于是这周就又把自己整理面经看到的计算机网络面试题又补上了,一共60多道。只要把这些面试题拿下,计算机网络基本就差不多了,面试题如下?1.OSI的七层模型分别是?各自的功能是什么?2.为什么需要三次握手?两次不行?3.为什么需要四次

    2022年6月24日
    22
  • 一遍记住Java常用的八种排序算法与代码实现[通俗易懂]

    一遍记住Java常用的八种排序算法与代码实现[通俗易懂]一遍记住Java常用的八种排序算法与代码实现

    2022年4月21日
    37
  • 晚上不用加班了,推荐十款精选IntelliJIdea插件,效率提升N倍[通俗易懂]

    大家好,我是雷小帅,今天给大家推荐开发利器,保证你效率蹭蹭蹭上升。俗话说:"工欲善其事必先利其器",小帅从项目实战的角度在众多的idea插件中挑选了10款开发必备的神器,帮助大家在日常工作学习编码中提升开发效率。1KeyPromoterX实用指数:★★★★★装逼指数:★你还在为记不住快捷键烦恼吗,KeyPromoterX可以帮助你快速记住常用的快捷键。当你在idea中用鼠标点击菜单,它可以显示对应的快捷键以及点击次数。使用一段时间后有助于过渡到更快、无鼠标的开发。

    2022年4月18日
    28
  • Win10 CMD命令大全与超好用的快捷键

    Win10 CMD命令大全与超好用的快捷键一、WindowsCMD命令大全按组合键Win(Windows图标键)+R键打开运行窗口,输入“cmd”按回车即可打开cmd命令提示符在窗口右击选择属性可进行个性化设置~  1.calc:启动计算器  2.appwiz.cpl:程序和功能  3.certmgr.msc:证书管理实用程序  4.charmap:启动字符映射表  5.chkdsk.e…

    2022年5月30日
    36
  • 一比一还原axios源码(六)—— 配置化

    上一章我们完成了拦截器的代码实现,这一章我们来看看配置化是如何实现的。首先,按照惯例我们来看看axios的文档是怎么说的:首先我们可以可以通过axios上的defaults属性来配置api。我们可

    2022年3月25日
    43

发表回复

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

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