最近在看大佬写的Python教程自学,但是感觉有点头痛,因为大佬讲了一些底层的结构和原理,但是又没那么详细,然后作为一个初学者自学的情况下,看的很费劲.看完就有感而发,想写一篇更基础的教程,教会大家怎么去用它,尽量少的去讲原理.但是当然,你也需要有一定的编程语言基础,了解基本的语法和函数等功能.
正所谓师傅领进门,修行在个人,有时候我们学了一个东西,如果觉得很有趣,自然就会去了解关于它的更多信息,但是在刚学的时候就一股脑的全部交给你,可能就比较打击信心,没有热情学下去了.
我的认知可能比较局限,对于我现阶段来说,我学习文件读写是为了数据持久化,期末的课程作业经常会让我们做学生管理系统,图书管理系统等等,但是我们知道,程序运行产生的数据,在你关掉程序的时候就会被清理掉了,下次运行程序又是从头开始,所以我们就要通过某种手段把数据保存下来.最常用的当然是数据库,可是对初学者来说,数据库的学习成本并不低,而且既然作为一个初学者,写一个程序存储的的数据可能也就几百几千条,并不需要对海量的数据进行增删改查,普通的文本文件的性能也是完全够用的.
下面我会用简单通俗的语言,尽量详细并且清晰的结合代码进行一个讲解:
Python中文件的读写是用内置函数open( )来进行的,我们可以查看一下open函数的参数
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
其中第一个file是文件名,mode是打开文件的方式,encoding是编码方式,其余的我们可以暂时不用了解,编码方式我简单的解释一下,就像指定了翻译的方式,一个文本用日语写的,然后你用中文的方式翻译,那么就会存在一些奇奇怪怪的问题,比如一个内容在这边代表1,再另外一边代表2,最后得到的就是一个错误的文本.在此不多赘述,感兴趣的读者可以查阅其他资料.
我们需要关注的是mode这个参数,常用的有模式有"r"读文件,"w"写文件,"a"追加读写文件,"r+"可读可写文件(不清空内容,但是文件必须存在),"w+"可读可写文件(清空内容,文件不存在会自动创建),"a+"可读可写文件(写时追加,不清空内容),下面我们一个一个来介绍.
file=open("test.txt","w",encoding="utf-8")
file.write("hello,world")
file.write("\nhello,world")
file.close()
首先open( )函数用写的模式打开了一个文件,并返回一个文件对象,使用file变量储存,然后调用file里面的write( )函数写入字符串"hello,world",最后调用file.close( )函数关闭文件,当test.txt文件不存在时,"w"模式会自动创建一个test.txt文件,运行完文件里的内容应该是
hello,world
hello,world
讲几个注意点,"w"模式写文件时,当文件不存在时会自动创建文件,当文件存在并且里面有内容时,会清空内容再进行写,写入的时候假如需要换行,我们需要用到"\n"这个换行符进行换行.
最后执行完操作要对文件进行关闭,虽然程序运行完也会自动关闭文件,但是假如在XXX管理系统中,用户要添加信息,这时候就要把内容写入文件,可是用户后续还会做其他操作,程序一直在执行,那么文件一直打开着,,但是又没有对它进行操作,就会浪费系统资源了.
下面我们看"r"模式
file=open("test.txt","r",encoding="utf-8")
print(file.read())
file.close()
执行程序,控制台会打印我们刚才写入的内容
hello,world
hello,world
关于"r"模式,我们需要注意的是,假如文件不存在,程序就会报错,所以就要用到Python里面的异常处理机制了.这个我打算下次再写一个文章来讲述,急于了解的读者可以先查阅其他资料.
接下来看"a"模式
file=open("test.txt","a",encoding="utf-8")
file.write("\nhello,python")
file.close()
这时test.txt文件的内容应为
hello,world
hello,world
hello,python
"a"模式比较简单,就是不清空内容接着往后写,并且和"w"模式有一个相同的特点就是当文件不存在的时候并不会报错,而是创建一个新的文件.
至于"a+","w+","r+",这是因为在写的时候我们是不能读的,在读的时候是不能写的,否则就会报错,但是这三个模式就可读可写,但是效果有所不同.
下面我们再看"r+"模式
file=open("test.txt","r+",encoding="utf-8")
print(file.read())
file.write("\nhello,python")
file.close()
现在控制台会打印
hello,world
hello,world
hello,python
并且test.txt文件的内容变为
hello,world
hello,world
hello,python
hello,python
但是r+有个比较坑新手地方就是, 假如我们这样写就会出现一定的问题
file=open("test.txt","r+",encoding="utf-8")
file.write("12345")
print(file.read())
file.close()
这时候控制台打印的效果是:
,world
hello,world
hello,python
hello,python
test.txt文件的内容是:
12345,world
hello,world
hello,python
hello,python
这是因为我们用的是r+模式一开始文件指针在头部,可以想象你的鼠标光标放在文件的最前面,这时候你开始写入内容了,就像数组一样,会覆盖掉内容,而并不是像我们在编辑的时候,把内容往后面挤,但是当你读取的时候,这时候文件指针在第六个位置,所以读取的时候又是从指针往后读的,所以又从逗号哪里开始往后打印.所以我们要用seek( )函数来解决,这个在解释完"a+","w+","r+"再讲.
w+就不再演示了,打开和w模式是一样的,会直接清空文件,然后再对文件进行操作,我们对文件的操作可以读也可以写
a+和a也是一样的,不会清空文件,写入的话从文件的末尾开始追写,一样也是对文件可以读可以写
但是w+和a+我们是读不到内容的,这里穿插一个知识点就是,read函数和write函数都是从文件指针开始往后面操作的,w+会先清空内容,写入内容后,文件指针会移动到最后,我们往后读是空的,a+是追写,一开始文件指针也是在最后,我们往后读也是空的,这时候就需要移动文件指针了,移动文件指针使用的函数是seek( ),
file=open("test.txt","a+",encoding="utf-8")
file.write("\n12345")
file.seek(0)
print(file.read())
file.close()
其中seek( )函数里面的参数就是你的指针要移动到哪个位置,0也就是文件的起始位置.实际我们在使用的时候,可以根据业务需求,移动到其他的地方.
假如现在test.txt文件的内容是
12345
执行完控制台打印的结果是
12345
12345
当然,test.txt文件的内容也是一样的
12345
12345
这里要声明一下,在这里我们才修改了test.txt文件的内容,所以我才要提示现在的文件内容,之前的代码都是没有动test.txt文件,直接在上面进行操作的.避免读者可能疑惑程序的执行结果.
最后我们讲一个读写文件的简化写法:
with open("test.txt","r",encoding="utf-8") as file:
print(file.read())
打印的结果是:
12345
12345
用with自动管理文件,将打开的文件赋给file,然后进行操作,这段代码在执行完会自动执行file.close( )操作,比较省心,避免我们忘掉关闭文件的情况.其他就没有特殊要注意的地方了.
然后作者写的可能有不足之处或错误,欢迎指正.
评论区