python向文本中插入文字

使用python向文本中插入文字

本文只记录方法,希望对你能有所帮助!

第一种-原生:

1. 首行插入

主要利用文件读取和写入。

def write_data_to_file(file: str, data: str) -> None:
    """
    读取文件,并将数据插入第一行
    :param file: 读取文件路径
    :param data: 插入数据
    :return:
    """
    with open(file, "r+", encoding="u8") as fp:
        tmp_data = fp.read()  # 读取所有文件, 文件太大时不用使用此方法
        fp.seek(0)  # 移动游标
        fp.write(data + "\n" + tmp_data)

行数很少,原理也很简单。
如果我们要判断数据是否存在,不存在就插入,该怎么写?
简单更改一下即可:

2. 数据不存在再插入
def write_data_to_file(file: str, data: str) -> None:
    """
    读取文件,并判断每行数据,如果和要插入的数据存在,就不插入,不存在,则插入第一行。
    :param file: 读取文件路径
    :param data: 插入数据
    :return:
    """
    with open(file, "r+", encoding="u8") as fp:
        # 遍历每行数据进行判断
        for d in fp.readlines():
            if data in d:
                break  # 存在就跳出
        else:
            fp.seek(0)
            tmp_data = fp.read()  # 读取所有文件, 文件太大时不用使用此方法
            fp.seek(0)  # 移动游标
            fp.write(data + "\n" + tmp_data)

利用一个读取文件行做了一个判断,也比较简单。
升级一下,在某一行进行插入。

3. 任意行插入
def write_data_to_file(file: str, data: str, row: int = 1) -> None:
    """
    读取文件,在某一行插入。
    :param file: 读取文件路径
    :param data: 插入数据
    :param row: 插入行
    :return:
    """
    front_data = ""  # 前半部分存储
    after_data = ""  # 后半部分存储
    with open(file, "r+", encoding="u8") as fp:
        # 遍历每行数据进行判断行数,利用 enumerate 辅助计数
        for i, d in enumerate(fp.readlines(), start=1):
            if i >= row:
                after_data += d
            else:
                front_data += d

        fp.seek(0)  # 回到初始点
        fp.write(front_data)
        fp.write(data + "\n")
        fp.write(after_data)

同样代码也比较简单,利用前后分割,做的拼接。
这就是原生办法。
接下来我们介绍一个内置库fileinput

第二种-fileinput实现行数据插入

使用内置的fileinput实现,代码更简单:

1. 第一行插入
def replace_file_data(file_path: str, data: str) -> None:
    """
    在第一行插入数据
    :param file_path: file 路径
    :param data: 插入的数据
    :return:
    """
    with fileinput.input(files=file_path, inplace=True) as fp:
        for d in fp:
            if fp.filelineno() == 1:
                # 如果行数为 1 则进行插入
                print(data)
            print(d, end="")

需要注意inplace必须为true,他会捕捉当前的stdout,然后加入文件,我们为了简单,就直接使用print,所有也可以做删除操作,当行数等于某行时,就不print即可。
我们再介绍一个小方法,数据读取,一次性读取多个文件。代码如下:

2. 批量读取文件
def read_all_text(files: Iterable) -> None:
    """
    读取所有文件数据
    :param files: 数据组
    :return:
    """
    with fileinput.input(files=files) as f:
        for line in f:
            print(line, end="")

只需要调用函数即可。

read_all_text(["a.txt", "b.txt"])

好了,今天的小技巧就到这里,希望你能有所收获。

相关文件及代码:点击这里

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值