the day of python learning(文件)
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来
1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') 默认打开模式就为r
2. 通过句柄对文件进行操作
data=f.read()
3. 关闭文件
f.close()
关闭文件时,一种是关闭操作系统所打开的占内存的部分;另一种则是直接删除应用程序f文件
f.close()
del f 必须在close之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源。
也可以用with关键字来帮我们管理上下文
with open('a.txt','w') as f :
pass
with open('a.txt','r') as read_f, open('b.txt','w') as write_f :
data = read_f.read()
write_f.write(data)
文件的编码
以什么编码方式储存,就以什么方式打开
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码就是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
str------->>>byte encode 编码
r = '任阳城是帅哥'
s = r.encode('gbk') encode编码
print(s)
byte------>>str decode 解码
t =s.decode('gbk')
print(t)
英文字符解码编码都可以,因为占的字节都为一
s = 'abf'
b = s.encode('utf-8')
print(b)
byte --->str decode 解码
s1 = b.decode('gbk')
print(s1)
文件的操作
a.txt
1,文件路径:d:\a.txt
2,编码方式:utf-8 gbk 。。。。
3,操作方式:只读,只写,追加,读写,写读.....
以什么编码方式储存的文件,就得以什么编码打开进行操作。
绝对路径与相对路径
只读:r(文件必须存在,不存在则会异样)
bytes ---->> str
f = open('test',mode='r',encoding='utf-8')
content = f.read()
print(content,type(content))
f.close()
f = open('test',mode = 'rb',)
content = f.read()
print(content)
f.close()
只写:w(不可读,存在则清空内容再写,不存在则创建)
wb
先将源文件的内容全部清除,再写
f = open('无',mode='w',encoding='utf-8')
f.write('如果没有这个文件则创建,写的编码方式为utf-8')
f.close()
wb
f = open('无',mode='wb')
f.write('以字节的形式写入'.encode("utf-8"))
f.close()
r+ 读写
r+b 读写(以bytes类型)追加读写
f = open('log',mode='r+',encoding='utf-8')
print(f.read())
f.write('洋葱是笨蛋')
f.close()
f = open('log',mode='r+b')
print(f.read())
f.write('加油努力'.encode('utf-8'))
f.close()
只能追加a,ab(不可读;不存在则创建,存在则只追加内容)
f = open(log',mode='a,encoding = 'utf-8')
f.write('我最帅')
f.close()
f = open('log',mode = 'a+b')
f.write('我最帅'.encode('utf-8'))
f.close()
总结:
带+可以读写,相当于多一个功能
r+读写,w+写读,a+写读
带b用于非字符文件的传输,保存。'b'表示将其以字节的形式存储,使用这种模式无需考虑文本文件的字符编码、图片文件的ipg格式、视频文件的avi格式
rb,wb,ab
注意点:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
以bytes类型操作的可读可写追加模式
r+b,w+b,a+b
文件的操作方法
4.1常用操作方法。
read(3):
1.文件打开方式为文本模式时,代表读取三个字符
2.文件打开方式为非文本模式(b),代表读取三个字节
其余的文件内光标移动都是以字节为单位的:
如seek,tell,truncate
注意点:
1.seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论是哪种模式,都是以bytes为单位移动
2.truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。
操作函数:
f.close()关闭文件
f.next()获取下一行数据,不存在则报错
f.read()读取指定字节数据
f.readline()仅仅读取一行数据
f.readlines()读取所有数据,并根据换行保存值列表
f.seek()指定文件中指针位置
f.tell()获取当前指针位置
f.truncate()截断数据,仅保留指定之前的数据
f.write()写数据
f.writelines()将一个字符串列表写入文件
f.xreadlines()可用于逐行读取文件,非全部
f.readable()判断是否可读
f.seekable()指针是否可操作
f.writable()是否可写
文件的修改
文件的数据是存放在硬盘上的,因而只存在覆盖,不存在修改一说。
文件是不可修改的,我们平时修改的只是系统模拟出来的效果
方式一:
将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕欧,再由内存覆盖到硬盘中(word,vim,nodpad++等编辑器)
import os
with open('old') as read_file , open('new',mode = 'w') as write_file:
data = read_f.read() #先全部读入内存,过大会造成系统卡死
data = data.replace('原来的内容',’替换的内容‘)#在内存之后完成修改
write_f .write(data)#一次性写入新的文件
os.remove('old')#移除原文件
os.rename('new','old') #将新的文件取名为原文件名。达到模拟修改效果
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕后就写入新的文件中,最后用新文件覆盖旧的文件
import os
with open('old') as read_file , open('new',mode = 'w') as write_file:
for line in read_file:
line = line.replace('原来的内容','替换的内容')
write_f.write(line) #这里调用for循环,一边替换一边进行写入
os.remove('old')#移除原文件
os.rename('new','old') #将新的文件取名为原文件名。达到模拟修改效果