python文件处理
1、什么是文件
??应用程序产生的数据首先存在内存上,内存是通过电磁进行工作的断电则数据丢失,想要数据永久存储则需将数据存放在硬盘里。硬盘是计算机的硬件之一,应用程序不能直接操作硬件,应用程序操作硬件需要调用操作系统间接操作硬件。 ??文件就是操作系统提供给应用程序操作硬盘的虚拟概念(接口)。
2、文件的读写流程
2.1 打开文件
f = open(path+filename,mode="rt",encoding="utf-8")
path+filename:文件的路径+文件名字
绝对路径:
windows:从某个盘盘开始,比如 "D:\python\a.txt"
注:“\”在python字符中表示转义字符,若路径中出现\n等,则路径不成立。
替代方式:
方式一:r"D:\python\a.txt",字符串前加 r 表示防止转义
方式二:"D:/python/a.txt",用右斜杠代替左斜杠
方式三:"D:\\python\\a.txt",用左双斜杠代替左斜杠
linux:从根目录或者从家目录开始
/home/gsf/a.txt
/data/a.txt
相对路径:
以python文件为参照,比如说a.txt和python文件在同一个目录下面,则path+filename的相对路径为"a.txt",就不需要写前面的"D:/python/"
mode:文件读写内容,文件读写操作
文件读写内容:t,b 默认为t
文件读写操作:r,w,a,r+,w+,a+ 默认为r
encoding:读写文件的编码方式
2.2 读/写
open打开文件只是返回一个文件对象(_io.TextIOWrapper),此时相当于文件对象与硬盘上的文件建立一个联系,真正操作文件需要对文件对象进行读和写。
读文件的方法:
read() 读取整个文件内容(大文件,内存消耗大,可能导致程序崩溃)
readline() 读取一行文件内容
readlines() 读取整个文件内容,返回一个列表,列表的每一个元素便是一行文件内容(大文件,内存消耗大,可能导致程序崩溃)
写文件的方法:
write() 写入一个字符串
writelines() 写入一个列表,但列表元素都为字符串
2.3 关闭文件
关闭文件回收系统资源
每个系统打开文件的数量个数有限,若超过限度系统非常卡顿,同时打开多个文件并且没有关闭内存开销也非常巨大。
方法:
close()
2.4 实例
f = open("a.txt",mode="r",encoding="utf-8")
f.read()
f.close()
3、with 上下文管理
使用with上下文管理,不再需要close()方法关闭文件,with会帮我们关闭文件,并且with可以同时管理多个文件。
with open("a.txt",mode="r",encoding="utf-8") as f:
pass
with open("a.txt",mode="r",encoding="utf-8") as fi ,\
open("w.txt",mode="r",encoding="utf-8") as fo :
pass
4、文件处理模式
4.1 文件读写操作
模式 | 内容 | 备注 |
---|
r | 只读模式 | 默认模式,若文件不存在报错。指针在行首 | w | 只写模式 | 若文件存在,则先清空文件所有内容,再写入新内容;若文件不存在,则建立文件。指针在行尾 | a | 只追加写模式 | 若文件不存在则报错;若文件存在则在末尾添加内容。指针在行尾 | r+ | 可读可写 | 与r模式相同,增加可写 | w+ | 可读可写 | 与w模式相同,增加可读 | a+ | 可读可写 | 与a模式相同,增加可读 |
4.1.1 实例一:r
a.txt 文件内容:
gsf:123
tom:456
print("欢迎来到登录页面")
ip_name = input("请输入用户名>>>:")
ip_passwd = input("请输入密码>>>:")
with open("a.txt",mode="r",encoding="utf-8") as f:
for line in f:
name,passwd = line.strip().split(":")
if ip_name == name and ip_passwd == passwd:
print("{}登录成功!!!".format(name))
break
else:
print("用户名或者密码错误!!!")
4.1.2 实例二:w
with open("b.txt","w",encoding="utf-8") as f:
f.write("haha\n")
f.writelines(["1\n","2\n","3\n"])
4.1.3 实例三:a
print("欢迎来到注册页面")
name = input("请输入用户名>>>:")
passwd = input("请输入密码>>>:")
with open("a.txt",mode="a",encoding="utf-8") as f:
f.write("{}:{}\n".format(name,passwd))
4.2 文件读写内容
模式 | 用法 |
---|
t | 操作文本内容(字符串) | b | 操作二进制neir |
t(默认的):文本模式 ?? 1. 读写文件都是以字符串为单位的 ?? 2. 只能针对文本文件 ?? 3. 必须指定encoding参数 b:二进制模式: ?? 1.读写文件都是以bytes/二进制为单位的 ?? 2. 可以针对所有文件 ?? 3. 一定不能指定encoding参数 注:t,b不能单独使用,平时使用的r,w,a,其实是rt,wt,at.
5、文件操作方法
5.1 读
文件读的方法能在r,a,r+,w+,a+模式下可以使用
方法 | 用法 |
---|
read | 读取所有内容,执行完该操作后,文件指针会移动到文件末尾 | readline | 读取一行内容,光标移动到第二行首部 | readlines | 读取每一行内容,存放于列表中 |
with open("a.txt","r",encoding="utf-8") as f:
res = f.read()
print(res)
with open("a.txt","r",encoding="utf-8") as f:
res1 = f.readline()
print(res1)
res2 = f.readline()
print(res2)
with open("a.txt","r",encoding="utf-8") as f:
res = f.readlines()
print(res)
5.2 写
方法 | 用法 |
---|
write | 写入一个字符串 | writelines | 写入一个列表,列表元素都为字符串 |
注:当文件读写内容模式为b时,在写的时候字符串得转换成字节才可写入,否则报错。
5.3 其他操作方法
方法 | 用法 |
---|
readable | 判断文件是否可读 | writable | 判断文件是否可写 | closed | 判断文件是否关闭 | encoding | 获取文件编码,如果文件打开模式为b,则没有该属性 | flush | 立刻将文件内容从内存刷到硬盘 | name | 获取文件名字 |
6、文件指针 seek
前面的操作模式都是被动触发指针移动,有些特殊场景需要读取某些位置内容,有时则写入特殊位置,这个时候则需要我们自己控制指针。 seek操作指针是以字节为单位。
语法: ?? seek(指针移动的字节数,模式) | 模式 | 内容 | |–|–| | 0 | 以文件开头为参照 | | 1 | 以当前指针所在的位置为参照 | | 2 | 以文件末尾的位置为参照 |
强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
with open('a.txt','rt',encoding="utf-8") as f:
f.seek(6,0)
res = f.read()
print(res)
with open('a.txt','rb') as f:
f.seek(-6,2)
res = f.read()
print(res)
with open('a.txt','rb') as f:
res = f.read()
print(res)
f.seek(-6,1)
res1 = f.read()
print(res1)
|