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() 读取整行,包括 "\n" 字符。(通常使用此方法进行读取) 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)+"\n") 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]) + "\n" 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)+"\n") 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)+"\n") 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") # 把新文件名改为原有的文件名