7 文件操作
一 打开文件的方式
1 f = open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8')
f.flush()
f.close()
2 with open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8') as f,\
open('文件名或者文件路径',mode=‘打开方式’,encoding='utf8') 打开多个文件方式
二 文件常用的操作方法
- r 读取文件
open表示打开一个文件 f 变量, 操控胡辣汤.txt文件的句柄 f = open("胡辣汤", mode="r", encoding="utf-8") 读取文件中的内容 read(n) 读取n个字符 content = f.read(3) content = f.read() # 一次性全都读取出来,占内存 line = f.readline() # 读取一行数据 print(line.strip()) # strip()去掉空白。空格, \t \n line = f.readline() # 读取一行数据 print(line.strip()) lst = f.readlines() # 一次性全都读取出来, 返回的是列表包括换行符 print(lst)
- w 写入文件
特点: 先清空文件里面的内容再写入
W
f = open("黑猫记者", mode="w", encoding="utf-8") # w可以帮我们创建文件 # f.write("\n") f.write("太黑\n") f.write("很黑\n") f.write("特别黑\n") f.close()
- a 追加模式
特点:只能在文本末尾添加
- b 模式
特点:一般使用在图片,视频等非文字文件的操作
b - bytes 读取和写入的是字节 , 用来操作非文本文件(图片, 音频, 视频) rb, wb, ab # 把刘亦菲从d盘复制到g盘, 单纯的从bytes角度来复制的。 适用于所有文件 f1 = open(r"d:\刘亦菲.jpeg", mode="rb") f2 = open(r"g:\刘亦菲.jpeg", mode="wb") for line in f1: # 分批量的读取内容 f2.write(line) # open()出来的结果可以使用read或者write. 根据mode来看 f1.close() f2.close()
-
r+ 读写, w+ 写读, a+ 追加写读, r+b, w+b, a+b
特点:一般
正常的 f = open("唐诗", mode="r+", encoding="utf-8") content = f.read() f.write("黄蓉") print(content) # 错误的示范 f = open("person", mode="r+", encoding="utf-8") f.write("杨千桦") # 默认如果直接写入的话。 在开头写入。 覆盖开头的内容 content = f.read() print(content) # r+ # 坑: 不论你读取多少内容。再次写入的时候都是在末尾 f = open("唐诗", mode="r+", encoding="utf-8") info = f.read(3) f.write("胡辣汤") print(info)
- w+ 写读(不常用)
# w+ f = open("唐诗", mode="w+", encoding="utf-8") # 先清空。 然后再操作 f.write("你好。 我叫肿瘤君")#清空文件写入 f.seek(0)#移动光标可以读取 content = f.read() # 写入东西之后。 光标在末尾。 读取不到内容的 print(content) f.close()
- a+ 追加写读
# a+, 不论光标在何处 写入的时候都是在末尾 f = open("唐诗", mode="a+", encoding="utf-8") f.write("我叫李嘉诚") # 默认写在末尾 f.seek(0)#移动光标可以读取 content = f.read()#写入之后光标在最后不可读 print(content) f.close()
三 文件中几个操作方法
-
seek(参数1,参数2)移动光标
参数1 表示的是偏移量,移动多少个单位
参数2 表示从什么位置进行偏移
0: 光标移动到开头
1: 当前位置
2: 光标移动到末尾
f.seek(3) # 以字节为单位
info = f.read(3) # 读取三个字符
2 tell() 程序返回当前光标的位置
3 truncate() 截断文件. 慎用按字节截取
四 文件的修改
import os # 导入os模块 import time # 时间模块 # 优点:不用关闭句柄, 自动关闭连接 with open("唐诗", mode="r", encoding="utf-8") as f1,\ open("唐诗_副本", mode="w", encoding="utf-8") as f2: for line in f1: line = line.replace("善良", "sb") f2.write(line) time.sleep(5) os.remove("唐诗") # 删除源文件 time.sleep(5) os.rename("唐诗_副本", "唐诗") # 把副本改名成源文件
- 文件修改的一道练习
6,文件a1.txt内容
序号 部门 人数 平均年龄 备注
1 python 30 26 单身狗
2 Linux 26 30 没对象
3 运营部 20 24 女生多
通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
with open('ax', mode='r', encoding='utf8') as f: lis1=[] lis2=[] line1=f.readline() line1=line1.strip().split(' ') for i in line1: if i is not '': lis2.append(i) # print(lis2) for line in f: lis3 = [] dic = dict() line=line.strip().split(' ') print(line) for m in line: if m is not '': lis3.append(m) # print(lis3) for i in range(len(lis2)): dic[lis2[i]] = lis3[i] lis1.append(dic) print(lis1)
7 用户注册登陆
# 12,写一个函数完成三次登陆功能,再写一个函数完成注册功能(升级题) def register(): while 1: with open('账号密码', 'r+', encoding='utf8') as f: name = input('用户名:')#打开文件注意一般在循环里面 password = input('密码:')#因为光标会随着for循环移动 for line in f: #导致光标前面的内容无法检测 # print(line.strip()) #可以用seek函数移动光标 # line = line.strip().split(':') # if line[0] == name: if line.strip().split(':')[0] == name: print('该用户已经注册,请重新注册') break else: # f.seek(0,2) f.write(name+':'+password+'\n') print('完成注册') break register() def land(): m = 3 # with open('账号密码',encoding='utf8') as f: while m > 0: with open('账号密码', encoding='utf8') as f: name = input('输入用户名:').strip() passwrd = input('输入密码:').strip() for line in f: line = line.strip().split(':') if line[0] == name and line[1] == passwrd: print('登陆成功') m = 0 break else: m -= 1 print('用户名或者密码错误还有%s次机会'% m) land()