zoukankan      html  css  js  c++  java
  • python的文件操作及简单的用例

    一、python的文件操作介绍

      1、文件操作函数介绍

        

    1 open() 打开一个文件
      语法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
      含义:
        file: 必需,文件路径(相对或者绝对路径)。
        mode: 可选,文件打开模式
        buffering: 设置缓冲
        encoding: 一般使用utf8
        errors: 报错级别
        newline: 区分换行符
        closefd: 传入的file参数类型
        opener:
      
    使用:open() 函数常用形式是接收三个参数:文件名(file)和模式(mode)和字符编码(encoding)。
      open("./file/login.txt", encoding="utf-8", mode="rb+")  


    2 write() 将字符串写入文件,返回的是写入的字符长度 3 read() 从文件读取指定的字节数,如果未给定或为负则读取所有。 4 readline() 读取整行,包括 " " 字符。(通常使用此方法进行读取5 readlines() 读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力 6 next()返回文件下一行 7 seek()设置文件当前位置 seek(0) 返回到首行 8 tell()返回文件当前位置。 9 close() 关闭打开的文件


      2、文件操作模式

        

    mode:
    r : 读(指针在开头,不会创建文件,不会覆盖)
    r+ : 读写(指针在开头,不会创建文件,不会覆盖)
    w : 写(指针在开头,会创建文件,会覆盖)
    w+ : 写读(指针在开头,会创建文件,会覆盖)
    a : 写(指针在结尾,会创建文件,不会覆盖)
    a+ : 写读(指针在结尾,会创建文件,不会覆盖)
    b : 一般用以读取非文本文件的数据,如:音频、图片等,读取的是流的形式
    # 读写模式 模式 r r+ w w+ a a+ 读  + + + + 写     + + + + + 创建             + + + + 覆盖        + + 指针在开始 + + + + 指针在结尾     + +

    二、python的文件内容增删改查

      1、文件的读取方式

        语法一:  

    f = open("./login.db", encoding="utf-8", mode="r")
    print(f.read())  # 读取全部
    print(f.readline())  # 读取一行
    print(f.readlines())  # 读取全部,每一行会生成一个数组
    f.close()  # 这种形式的文件操作一定记得操作完进行关闭

        语法二:

    # 这种形式的默认读取完毕后会自动执行f.close()
    with open("./file/login.txt", encoding="utf-8", mode="r") as f:
        print(f.read())  # 读取全部
        print(f.readline())  # 读取一行
        print(f.readlines())  # 读取全部,每一行会生成一个数组

        语法三:

    # py157431816730404$###$赵八万$###$202cb962ac59075b964b07152d234b70$###$女$###$2000-03-05$###$赚八万$###$2019-11-21 14:36:07
    
    # 方式一
    with open("./file/login.txt", encoding="utf-8", mode="r") as f:
        for line in f:
            print(line.strip().split("每行截取的字符串"))  # 打印每一行数据
    
    # 方式二
    with open("./file/login.txt", encoding="utf-8", mode="r") as f:
        # enumerate()  获取key和value
        for k, line in enumerate(f):
            # strip()  去除两端的空格换行
            # replace(旧字符,新字符)  替换字符串中的某个字符串
            print("id: %s %s" % line.strip().replace("$###$", " | ")) # 打印每一行数据    

      2、文件的添加

        语法一:

    # 方式一
    f = open("./login.db", encoding="utf-8", mode="w")
    f.write("你好,我要拥抱全世界")  # write只能写字符串格式
    f.close()
    
    # 方式二
    with open("./login.db", encoding="utf-8", mode="w") as add:
        # join() 用###把一个数组的每个value串联拼接为一个字符串
        add.write("###".join(["张三", "123456", "", "吃饭、睡觉、打豆豆"]))

        语法二(写非文本文件):

    # 方式三(读取图片写到另一个文件中)
    with open("./123.jpg", mode="rb") as f, 
            open("./456.jpg", mode="wb") as add:
        add.write(f.read())  # 将读取到的图片流写入到另一个图片中
    # 分流读取大的文件,写入新的文件
    with open("day03/123.jpg",mode="rb") as f, open("day03/456.jpg",mode="ab") as ff: for i in f: ff.write(i)

      3、文件的修改

        方式一:

    # 执行修改文件的操作(最简单的修改)
    with open("./emp_new.txt", mode="w", encoding="utf-8") as f_add, 
            open("./emp.txt", mode="r", encoding="utf-8") as f:
        for k, v in enumerate(f):  # 逐行获取用户信息
            if k == int(ids):  # 如果相等就进行修改
                lit_info = v.strip().split("###")  # 获取用户单行的信息
                lit_info[0] = input("请输入员工名称:")
                lit_info[1] = input("请输入员工爱好:")
                lit_info[2] = input("请输入员工薪资:")
                f_add.write("###".join(lit_info)+"
    ")
            else:  # 不相等就复制
                f_add.write(v)
    os.remove("./emp.txt")
    os.rename("./emp_new.txt", "./emp.txt")
    print("修改成功")

        方式二:

    # 这种方式不需要改名字,但是只适用于文件比较小的时候,文件太大不要这样读取
    file_content = ""  # 定义一个变量用来存储数据
    with open("./emp.txt", mode="r", encoding="utf-8") as f:
        for k, line in enumerate(f):  # 逐行获取用户信息
            ids = input("请输入需要修改的员工ID:")
            if k == int(ids):  # 如果相等就进行修改
                name = input("请输入员工名称:")
                hobby = input("请输入员工爱好:")
                salary = input("请输入员工薪资:")
                new_str = "###".join([name, hobby, salary]) + "
    "
                file_content += new_str
            else:
                file_content += line
    
    with open("./emp.txt", mode="w", encoding="utf-8") as f_add:
        f_add.write(file_content)

        方式三:

    import os
    ids = input("请输入需要修改的员工ID:")
    name = ""
    birthday = ""
    salary = ""
    while 1:
        print("""
          请输入需要修改的员工信息
                over:结束
                1:修改名称
                2:修改爱好
                3:修改薪资
            """)
        staff_info = input("输入需要修改的属性,如果不修改输入over:")
        if staff_info.upper() == "OVER":  # 结束跳出
            break
        elif staff_info.upper() == "NEXT":  # 跳过属性的输入
            continue
        elif staff_info == "1":
            name = input("请输入员工名称:")
        elif staff_info == "2":
            birthday = input("请输入员工爱好:")
        elif staff_info == "3":
            salary = input("请输入员工薪资:")
        else:
            print("输入的信息不正确,请重新输入")
    
    with open("./emp_new.txt", mode="w", encoding="utf-8") as f_add, 
            open("./emp.txt", mode="r", encoding="utf-8") as f:
        for k, v in enumerate(f):  # 逐行获取用户信息
            if k == int(ids):  # 如果相等就进行修改
                lit_info = v.strip().split("###")  # 获取用户单行的信息
                print(lit_info)
                if name:
                    lit_info[0] = name
                if birthday:
                    lit_info[1] = birthday
                if salary:
                    lit_info[2] = salary
                f_add.write("###".join(lit_info)+"
    ")
            else:  # 不相等就复制
                f_add.write(v)
                
    os.remove("./emp.txt")
    os.rename("./emp_new.txt", "./emp.txt")
    print("修改成功")

        方式四:

    import os
    flag = False
    # 循环判断输入的id格式是否正确以及文件中有没有当前id
    while 1:
        ids = input("请输入需要修改的员工ID:")
        # isdigit() 判断一个字符是否是数字
        if not ids.isdigit() or ids.isdigit() < 1:
            print("输入的信息不正确,请重新输入")
        else:
            with open("./emp.txt", mode="r", encoding="utf-8") as f_check:
                for k, v in enumerate(f_check):  # 逐行获取用户信息
                    if k == int(ids):  # 如果相等就进行修改
                        flag = True
                        break
                else:
                    print("您找的用户信息不存在,请重新输入")
            if flag:  # 如果查找到了用户id就跳出循环
                break
            else:  # 如果没有找到就继续循环while,重新输入id
                pass  # 没有意义,只是为了使语句完整,做占位符使用
    # 执行修改文件的操作
    with open("./emp_new.txt", mode="w", encoding="utf-8") as f_add, 
            open("./emp.txt", mode="r", encoding="utf-8") as f:
        for k, v in enumerate(f):  # 逐行获取用户信息
            if k == int(ids):  # 如果相等就进行修改
                lit_info = v.strip().split("###")  # 获取用户单行的信息
                lit_info[0] = input("请输入员工名称:")
                lit_info[1] = input("请输入员工爱好:")
                lit_info[2] = input("请输入员工薪资:")
                f_add.write("###".join(lit_info)+"
    ")
            else:  # 不相等就复制
                f_add.write(v)
    os.remove("./emp.txt")
    os.rename("./emp_new.txt", "./emp.txt")
    print("修改成功")

      4、文件的删除

         方式一:

    import os  # 系统模块
    ids = input("输入您要删除的id:")
    with open("./login.db", mode="r") as f, 
            open("./login_new.db", mode="w") as add:
        for line in f:
            # 文件类型    1001$###$py157431816730404$###$赵八万$###$202cb962ac59075b964b07152d234b70$###$女
            user_info = line.strip().split("$###$")
         # 判断id 是否和用户中的id一致,如果一致就删除
    if ids == user_info[0]: # user_info[0] 这个地方问的是用户自增id,唯一的 continue else: add.write(line) os.remove("./login.db") # 删除原有的文件 os.rename("./login_new.db", "./login.db") # 把新文件名改为原有的文件名

        方式二:

    import os  # 系统模块
    while 1:
        ids = input("输入您要删除的id:")
        # isdigit() 判断一个字符是否是数字
        if not ids.isdigit() or ids.isdigit() < 1: 
            print("输入的信息不正确,请重新输入")
        else:
            break
    
    with open("./login.db", mode="r") as f, 
            open("./login_new.db", mode="w") as add:
        if f.readline():  # 先读取一行看看能不能取到数据,用来判断文件是否为空
            f.seek(0)  # 因为前面使用了f.readline(),这里需要把读取的指针重新放到开始位置,防止下面循环处理出问题
            for k, line in enumerate(f):
                # 文件字符类型   py157431816730404$###$赵八万$###$202cb962ac59075b964b07152d234b70$###$女
                if int(ids) == (k + 1):  # 如果用户信息没有存自增id,那么就以用户读取是的(下标+1)标识id
                    continue
                else:
                    add.write(line)
        else:
            print("删除失败,该文件中没有数据")
    
    os.remove("./login.db")  # 删除原有的文件
    os.rename("./login_new.db", "./login.db")  # 把新文件名改为原有的文件名
  • 相关阅读:
    Go语言操作etcd
    grafana使用
    Java整理
    Go操作MySQL
    Go语言操作Redis
    es
    influxDB
    gopsutil
    Java基础之(三):IDEA的安装及破解 lyl
    ClojureScript 点访问格式
  • 原文地址:https://www.cnblogs.com/liucysun/p/11890508.html
Copyright © 2011-2022 走看看