文件操作
目录1文件的概念
文件就是操作系统给用户操作的快捷方式。
2代码打开文件的两种方法
方式1:
open() 方法
Python open() 方法用于打开一个文件,并返回文件对象。
在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
eg:
f = open(文件路径,读写方式,encoding='utf8')
f.close()
方式2:
使用with方法
with open (文件路径,读写方式,encoding='utf8') as 变量名:
ps:with上下文管理可以自己子代码结束后自动调用close方法关闭资源
open方法的第一个参数是文件路径 并且撬棍跟一些字母的组合会产生特殊的含义导致路径查找混乱 为了解决该问题可以在字符串的路径前面加字母r
D:\a\n\t
r'D:\a\n\t'
以后涉及到路径的编写 推荐加上r
with支持一次性打开多个文件
with open() as 变量名1,open() as 变量名2,open() as 变量名3:
子代码
文件读写操作
'r' 只读模式:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
1文件路径不存在:会直接报错
with open(r'b.txt','r',encoding='utf8')as f:
print(f.read())
2文件路径存在:正常读取文件的内容
with open(r'a.txt','r',encoding='utf8')as f:
print(f.read())
'w' 只写模式:打开一个文件只用于写入
1如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。
with open(r'a.txt','w',encoding='utf8')as f:
f.write('study hard and make progress every day\n')
f.write('study hard and make progress every day\n')
f.write('study hard and make progress every day\n')
2如果该文件不存在,创建新文件。
with open(r'a.txt','w',encoding='utf8')as f:
pass
'a' 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
1文件路径不存在:自动创建文件
with open(r'b.txt','a',encoding='utf8')as f:
pass
2文件路径存在:自动在末尾追加内容
with open (r'a.txt','a',encoding='utf8')as f:
f.write('很开心见到了你')
当我们在编写代码的时候 有些部分不知道写什么具体代码 但是也不能空着不写这个时候可以使用关键字。
pass
...
只补全语法不执行功能 本身没有任何的含义
文件操作模式
t 文本模式
默认的模式,即上面的r w a其实全称是 rt wt at
1.只能操作文本文件.
2.读写都是以字符为单位。
3.需要指定encoding参数 如果不知道则会采用计算机默认的编码.
b 二进制模式(byte模式)
这个需要自己进行指定eg: rb wb ab
1.可以操作任意类型的文件.
2.读写都是以bytes为单位.
3.不需要指定encoding参数 因为它已经是二进制模式了 不需要编码.
二进制模式与文本模式针对文件路径是否存在的情况下 规律是一样的!!!
文件诸多方法
1.read()
一次性读取文件内容 并且光标停留在文件末尾 继续读取则没有内容
并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出
括号内还可以填写数字 在文本模式下 表示读取几个字符如果未给定或为负则读取所有。
2for循环
一行行读取文件内容 避免内存溢出现象的产生
3readline([size])
读取整行,包括 "\n" 字符。
4readlines()
#['study hard and make progress every day\n', 'study hard and make progress every day\n', 'study hard and make progress every day\n', '很开心见到了你']
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
5readline()
判断文件是否具备读数据的能力会返回true和false
6write()
将字符串写入文件,返回的是写入的字符长度。
7witeable()
判断文件是否具备写数据的能力true和false
8writeline()
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
9flush()
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
文件内光标的移动
with open(r'a.txt','rb')as f:
print(f.read())
f.seek(0,0)
print(f.read())
f.seek(0,0)
print(f.read())
print(f.tell())#返回光标距离文件开头产生的字节数
seek(offset,whence)
offset 是位移量 以字节为单位
whence 是模式 0 1 2
0是基于文件开头:文本和二进制模式都可以用
1是基于当前位置:二进制模式可以用
2是基于文件末尾:二进制模式可以用
使用encode 编码
decode 解码
作业
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
soure_file_path = input('拷贝文件路径').strip()
target_file_path =input('目标路径').strip()
with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f:
for line in read_f:
writr_f.write(lin)
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
while True:
print("""
1.注册功能
2.登录功能
""")
choice = input('请选择您想要执行的功能编号>>>:').strip()
if choice == '1':
username = input('please input your username>>>:').strip()
password = input('please input your password>>>:').strip()
# 2.校验用户名是否已存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f: # 'jason|123'
real_name, real_pwd = line.split('|')
if username == real_name:
print('用户名已存在 无法完成注册')
break # 一旦重复 没有必要继续往下校验是否重复了 直接结束循环
else:
with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
f1.write(f'{username}|{password}\n')
print(f'用户{username}注册成功')
elif choice == '2':
# 1.获取用户名和密码
username = input('please input your username>>>:').strip() # 'jason'
password = input('please input your password>>>:').strip() # '123'
# 2.打开文件读取内容并校验
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f: # 'jason|123\n'
real_name, real_pwd = line.split('|') # 'jason' '123\n'
if real_name == username and real_pwd.strip('\n') == password:
print('登录成功')
break
else:
print('用户名或密码错误')
else:
print('没有该功能编号')
标签:文件,encoding,input,print,操作,txt,open
From: https://www.cnblogs.com/bnmm/p/16772931.html