1、文件读写原理
内置函数open()创建文件对象
通过IO流将磁盘文件中的内容与程序中的对象中的内容进行同步,IO流就是input,output
语法规则:file=open(filename[,mode,encoding])
eg:
file=open('q','r',encoding='utf-8')
print(file.readlines())
file.close()
报错信息:UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 4: illegal multibyte sequence
原因:windows平台默认python文件是gbk格式,如果要打开的文件是utf-8,则就会报这个错
解决方法,加上encoding='utf-8'
2、"r","w","a","rb","wb","ab":指定对文件打开方式即文件内容操作方式,即只读,可写,追加,二进制读,二进制写,二进制追加
3、strip方法:移出字符串两侧不符合条件的字符(指定字符串中的每个字符)?
4、文件的类型,按文件中数据的组织形式,分为两类:
文本文件:存储的是普通“字符”文本,默认为unicode字符集,可以使用记事本程序打开
二进制文件:把数据内容用“字节”进行存储,无法用记事本打开必须使用专用的软件打开
打开模式:
r,以只读模式打开文件,文件的指针将会放在文件的开头
w,以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在文件的开头
a,以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在原文件末尾
b,以二进制方式打开文件,不能单独使用,需要与其他模式一起使用,rb,wb
+,以读写方式打开文件,不能单独使用,需与其他模式一起使用,a+
eg:
只读
file=open('q','r',encoding='utf-8')
print(file.readlines())
file.close()
只写:
file=open('a','w')
file.write('python')
print(file)
file.close()
追加:
file=open('a','a')
file.write('python')
print(file)
python文件在完成读写操作后为什么要关闭?
防止文件的损坏,释放资源,文件关闭后,文件内容才会同步到磁盘
read,readline,readlines的区别?
b.txt内容
嘿哈嘿 哈哈哈 嘻嘻嘻
read()方法:读入全部内容;
file=open('b','r',encoding='utf-8')
t=file.read()
print(t)
file.close()
结果:
嘿哈嘿
哈哈哈
嘻嘻嘻
readline()方法:读入一行内容;
file=open('b','r',encoding='utf-8')
t1=file.readline()
print(t1)
file.close()
结果:
嘿哈嘿
readlines()方法:读入文件所有行,以每行为元素形成列表。
file=open('b','r',encoding='utf-8')
t2=file.readlines()
print(t2)
file.close()
结果:
['嘿哈嘿\n', '哈哈哈\n', '嘻嘻嘻']
write和writelines的区别?
a.txt内容:
python
write()需要传入一个字符串做为参数,否则会报错
file=open('a','w')
file.write('python23')
print(file)
file.close()
结果:a.txt文件内容变为python23,因为a.txt文件原本就存在,所以会覆盖原本的内容
writelines()既可以传入字符串又可以传入一个字符序列,并将该字符序列写入文件
file=open('a','w')
list=['kangkang','jane','marry']
file.writelines(list)
print(file)
file.close()
结果:a.txt内容变为 kangkangjanemarry,writelines可以写入列表
5、一个中文占两个字节
6、文件对象的常用方法
read([size]),从文件中读取size个字节或字符的内容返回,若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline(),从文本文件读取一行内容
readlines(),把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str),将字符串str内容写入文件
writelines(s_list),将字符串列表s_list写入文本文件,不添加换行符
seek[offset[,whence]],把文件指针移动到新的位置,offset表示相对于whence的位置;offset:为正往结束方向移动,为负往开始方向移动
whence不同的值代表不同含义
0:从文件头开始计算(默认值)
1:从当前位置开始计算
2:从文件尾开始计算
tell(),返回文件指针的当前位置
flush(),把缓冲区的内容写入文件,但不关闭文件
close(),把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源
6、报错信息显示: (result, consumed) = self._buffer_decode(data, self.errors, final)
解决办法,将r改成rb
原因:r以只读方式打开文件,默认模式,出现utf-8编码问题
7、换行符是一个字符,一个字符是两个字节
8、如果flush和close都出现,必须先flush后close,否则会报错
9、with语句(上下文管理器)
with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的,即用with就不用close来释放资源
格式:
with open('logo.png','rb') as src_file:
src_file.read()
exit代表退出程序
with语句开始时,调用enter方法,结束时,调用exit方法,__enter__和__exit__必须一起使用
#上下文管理器,marry实现了__enter__和__exit__方法,称该类对象遵循了上下文管理器,该类的实例对象则为上下文管理器
class Marry(object):
def __enter__(self):
print('调用了enter方法')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('调用了exit方法')
def show(self):
print('调用了show方法')
with Marry() as file:
file.show()
结果:
调用了enter方法
调用了show方法
调用了exit方法
解释:file.show()是只调用了show方法,而结果输出的enter和exit是因为with的上下文管理器使之,with语句刚开始时调用enter,结束时调用exit
上下文管理器方法无是否程序异常,都会调用enter和exit方法,即前文说的“with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的”