文件操作
文件操作的介绍
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
1、什么是文件
文件是操作系统提供给用户/应用程序操作硬盘的一个虚拟单位
2、为何要用文件
存取硬盘必须使用文件
3、如何用文件
f.txt = open(文件路径,打开模式)
f.txt.write(数据)
f.txt.close()
应用程序/用户 文件对象/文件句柄=================》遥控器
操作系统 打开文件a.txt============》空调
硬件 硬盘
"""
# 绝对路径
# windows系统
# D:\python38\Doc\python383
# C:\a\b\c\new.txt
# linux系统
# /a/b/c/d.txt
# file_path=r'C:\a\b\c\new.txt'
# file_path=r'/a/b/c/d.txt'
# 相对路径
# c\d.txt
# d.txt
# 示范:
# r"D:\python全栈15期\day10\a.txt"
# f.txt = open(r"aaa\a.txt", mode='rt',encoding='utf-8')
# res=f.txt.read()
# print(res)
# f.txt.close()
# f.txt = open(r"aaa\a.txt", mode='rb')
# res=f.txt.read()
# # print(res,type(res))
# x=res.decode('utf-8')
# print(x)
# f.txt.close()
f=open('aaa.jpg',mode='rb')
res=f.read()
print(res)
f.close()
文件的打开模式分类两大类
一:控制文件读写操作的模式
1.1 r:只读(默认的):在文件不存在时则报错,文件存在时文件指针跳到文件开头
f.txt=open('a.txt',mode='rt',encoding='utf-8')
res = f.txt.read()
print(f.txt.readable())
print(f.txt.writable())
f.txt.close()
1.2 w:只写:在文件不存在时则创建空文件,文件存在时则清空,文件指针跳到文件开头
f.txt=open('b.txt',mode='wt',encoding='utf-8')
f.txt.write("你好啊哈哈哈\n")
f.txt.write("hello1\n")
f.txt.write("hello2\n")
f.txt.close()
1.3 a:只追加写:在文件不存在时则创建空文件,文件存在时也不会清空,文件指针跳到文件末尾
f.txt=open('c.txt',mode='at',encoding='utf-8')
f.txt.write("jason:777\n")
f.txt.write("jjj:666\n")
f.txt.close()
总结:w与a的异同
相同点:在打开了文件不关闭的情况下,连续地写入,新的内容永远跟在老内容之后
不同点:重新打开文件,w会清空老的内容,而a模式会保留老的内容并且指针跳到文件末尾
示范1:注册功能
name = input("your name: ").strip()
做合法性校验:
1、如果输入的用户名包含特殊字符^$&...让用户重新输入
2、如果输入的用户名已经存在也重新输入
pwd = input("your password: ").strip()
做合法性校验:
1、密码长度
2、如果密码包含特殊字符则重新输入
f.txt = open('user.txt',mode='at',encoding='utf-8')
f.txt.write('%s:%s\n' %(name,pwd))
f.txt.close()
示
#### 范2:登录功能
# inp_name = input("your name: ").strip()
# inp_pwd = input("your pwd: ").strip()
#
# f.txt = open('user.txt',mode='rt',encoding='utf-8')
# for line in f.txt:
# user,pwd=line.strip('\n').split(':')
# if inp_name == user and inp_pwd == pwd:
# print('login successful')
# break
# else:
# print('user or password error')
#
# f.txt.close()
升级需求1:同一个账号输错三次则退出
升级需求2:同一个账号输错三次则,该账号则锁定10秒,即便程序被终止,仍然计时
二:控制文件读写内容的模式
1.1 t(默认):读写都是以str字符串为单位,一定要指定encoding
f.txt=open('a.txt',mode='rt',encoding='utf-8')
f.txt.read()
f.txt.close()
1.2 b:读写都是以bytes为单位,一定不能指定encoding参数
f.txt=open('a.txt',mode='rb')
data=f.txt.read()
# print(data,type(data))
print(data.decode('utf-8'))
f.txt.close()
f.txt=open('d.txt',mode='wb')
f.txt.write("egon".encode('utf-8'))
f.txt.close()
示范1:文件拷贝程序
src_file=input("源文件路径:").strip()
dst_file=input("目标文件路径:").strip()
with open(r'%s' %src_file,mode='rb') as src_fobj,open(r'%s' %dst_file,mode='wb') as dst_fobj:
# data=src_fobj.read()
for line in src_fobj: # line=第二行内容
dst_fobj.write(line)
上下文管理with
with open() as f.txt,open() as f1:
f.txt.read()
补充
rwa
tb必须和rwa联用
+必须与rwa联用:r+、w+、a+
r+t
w+t
a+t
r+b
w+b
a+b
默认的是rt
with open('a.txt') as f:
pass
with open('a.txt',mode='w+') as f:
pass
读相关方法:
# with open('a.txt',mode='rt',encoding='utf-8') as f.txt:
# # line1=f.txt.readline()
# # line2=f.txt.readline()
# # line3=f.txt.readline()
# # print(line1)
# # print(line2)
# # print(line3)
#
# # lines=[]
# # for line in f.txt:
# # lines.append(line)
#
# # lines=f.txt.readlines()
# # print(lines)
写相关方法:
# with open('a.txt',mode='wt',encoding='utf-8') as f.txt:
# # lines=['111\n','222\n','333\n']
# # for line in lines:
# # f.txt.write(line)
# # f.txt.writelines(lines)
#
# f.txt.writelines("hello")
控制文件内指针的移动都是以字节为单位,
只有一种特殊情况,t模式下的read(n),代表的是n个字符,此外代表的全都是字节
wi
#### th open('f.txt',mode='rt',encoding='utf-8') as f:
#### data=f.read(6) # 6个字符
#### print(data)
# with open('f.txt',mode='rb') as f:
# # data=f.read(6) # 6个字节
# data=f.read(8) # 8个字节
# print(data.decode('utf-8'))
# f.txt.seek(n,模式) #
n代表的移动的字节个数
模式:
0模式:参照文件的开头开始移动(只有0模式可以在t下使用,1和2模式只能在b下使用)
w
# ith open('f.txt',mode='rt',encoding='utf-8') as f:
# f.seek(5,0)
# print(f.tell())
# print(f.read())
# print(f.tell())
# print('='*100)
# f.seek(0,0)
# print(f.read())
1模式:参照指针当前所在的位置
# with open('f.txt',mode='rb') as f:
# f.seek(3,1)
# f.seek(3,1)
# print(f.tell())
# # f.seek(2,1)
# f.seek(5,0)
# print(f.read().decode('utf-8'))
2模式:参照文件末尾的位置
# with open('f.txt',mode='rb') as f:
# f.seek(0,2)
# f.seek(-3,2)
# # print(f.tell())
# print(f.read().decode('utf-8'))
模拟程序记录日志的功能
# import time
#
# for i in range(1000000000):
# with open('access.log',mode='at',encoding='utf-8') as f:
# t=time.strftime("%Y-%m-%d %H:%M:%S")
# content="egon给刘老师转了%s个亿" %i
#
# msg=f"{t} {content}\n"
# f.write(msg)
# time.sleep(3)
f.truncate(n)从文件开头往后数n个字节保留下来,其余全部删除
f.truncate()从文件开头往后数指针当前所在的位置,其余全部删除
每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)