文件的操作
前面我们已经说过了文件的打开和关闭了,文件操作步骤的前后两步我们都已经了解了,那我们现在开始学习中间的步骤-----文件的操作叭
对文件的操作主要分为两类:读取和写入
读取就是把文件里的数据读取出来,写入就是对文件进行修改。
(●’◡’●)
下面我们先来康康文件的读取叭
文件的读取
当文件以文本形式打开时读写按照字符串形式,采用当前计算机使用的编码或者指定编码;当文件以二进制形式打开时读写按照字节流方式。
❶file.readall():
读入整个文件内容,返回一个字符串或者字节流。
❷file.read(size=-1):
从文件中读入整个文件内容,如果给出参数读入前size长度的字符串或者字节流
❸file.readline(size=-1):
从文件中读入一行内容,如给出参数则读入该行前size长度的字符串或字节流
❹file.readlines(hint=-1):
从文件中读入所有行,以每行为元素形成一个列表,如果给出参数则读入hint行
readlines展示:
read_demo1=open("D:/pythonDemo/pyDemo2.txt",'r',encoding='utf8')
for line in read_demo1.readlines():
print(line)
read_demo1.close()
'''
首先打开一个文本文件,以utf8编码返回结果,接着使用readlines把每一行的结果作为一个元素形成列表
接着用line当作循环变量遍历形成的列表并输出
'''
readall这个方法在我的pycharm里好像不适用了
使用时有一个异常:
这个版本的pycharm好像没有这个方法了。
AttributeError: ‘_io.TextIOWrapper’ object has no attribute ‘readall’
这是read方法:
read_demo1=open("D:/pythonDemo/pyDemo2.txt",'r',encoding='utf8')
print(read_demo1.read())
结果是:
到这里了会有小伙伴有疑问了,read,readline,readlines这三个函数有什么区别呢?傻傻分不清楚啊,其实我们可以从内存占用的角度分析:
首先read和readlines都是一次性读取完整个内容,都需要占用较大的内存空间,相当于是一口吃掉一个汉堡,你的胃此时容纳了一整个汉堡,有点占用地方。read从头到尾读取,读取完所有内容位置,readlines按行读取,以行为单位,而且readlines把每一行的结果作为一个元素保存在列表中,我们需要的时候可以使用下标进行访问。前两者都是一口吃掉整个汉堡,比较占用内存而我们的readline是读取一行,如果也让readline读取完所有内容相当于我们一小口一小口的吃掉汉堡,大大减轻了胃的负担。那么如何利用循环结构来让readline逐行读取完所有内容呢?
首先我们要清楚readline判定读取完一行的依据:
当遇到回车(\r)或者换行符(\n)时会返回结果
我们可以利用循环来进行逐行读取:
read_demo1=open("D:/pythonDemo/pyDemo2.txt",'r',encoding='utf8')
line=read_demo1.readline()
while line:
print(line,end="")
line=read_demo1.readline()
read_demo1.close()
只要readline读取的内容不为空就可以继续读取,直到读取内容为空时退出循环。
其实python已经考虑到了整个读入文件会影响执行效率并且占用内存,因此python把文件本身作为一个行序列,遍历文件的所有行还可以这样做:
read_demo1=open("D:/pythonDemo/pyDemo2.txt",'r',encoding='utf8')
for line in read_demo1:
print(line,end="")
read_demo1.close()
结果是:
以上就是我们读操作的相关讲解,读取完了那我想写入一些东西怎么办呢?那就接着往下看呗
文件的写入
❶file.write()
向文件写入一个字符串或者字节流
❷file.writelines(lines)
将一个元素全为字符串的列表写入文件
❸file.seek(offset)
改变当前文件操作指针的位置,offset的值为:
0—文件开头;1—当前位置;2—文件末尾
lt=['\r你今天好棒啊','你今天学废了吗','么么么么么么么么达哒哒']
write_demo=open("D:\pythonDemo/pyDemo2.txt","a+")
#用writelines向文件写入列表
write_demo.writelines(lt)
write_demo.close()
#用write向文件写入:
write_demo1=open("D:\pythonDemo/pyDemo1.txt","a+")
write_demo1.write("\n你今天好棒呀!加油")
write_demo1.close()
我们来看结果:
然后pyDemo2的写入情况:
write方法与writelines方法的区别在于前者需要传入的参数可以是字符串也可以是一个列表而后者只能传入列表。
现在我们来向文件写入一首诗并输出它
file=open("D:\pythonDemo/poetDemo.txt","a+")
ls=["窗前明月光\n","疑是地上霜\n","举头望明月\n","低头思故乡\n"]
file.writelines(ls)
for line in file:
print(line)
file.close()
执行完程序发现并没有输出结果,难道是写入失败了吗?这时我们前去查看poetDemo文件发现已经成功写入了呀,那为什么没有任何输出呢?
这时我们的seek函数就派上了用场(seek函数:等了好久终于该说我了( ̄^ ̄) 哼!)
我们的从哪一行或者哪个字符对文件进行操作全是靠操作指针,当前内容写入文件后操作指针却在写入内容的后面,就像我们打字一样,闪烁的光标永远都在打出内容的后面,但是这时我们已经写入完毕,指针仍在写入内容后面,那么我们如果此时进行打印内容,根据指针的指示我们实际打印的内容却在写入内容后面,由于写入内容后面是空白我们打印的也是空白了。所以我们如果写入内容完毕后想要打印当前内容就需要把指针移动到文件开始即可
file=open("D:\pythonDemo/poetDemo.txt","w+")
ls=["窗前明月光\n","疑是地上霜\n","举头望明月\n","低头思故乡\n"]
file.writelines(ls)
file.seek(0)
for line in file:
print(line,end="")
file.close()
此时就能正常输出了
此时的seek函数:(知道我有多重要了吧!要好好使用我,不然你写完东西啥也打印不出来尴尬死你(•‾̑⌣‾̑•)✧˖°)
我们写如内容时都是默认不进行换行的,所以可以在每一段内容之后加上回车符\n或者\r会更美观哟,你品,你细品
到这里我们的文件操作就讲解完了哟,一定要多加练习哟,好了,散会!ლ(´ڡ`ლ)