'''文本文件和二进制文件的区别是,文本文件内部以字符形式存储区数据,字符是有编码的,比如GBK(简体中文)、UTF-8等;
在二进制文件的内部以字节形式存储数据,没有编码的概念。
二进制文件较为常用,如Windows中的exe、图片(png、jpg等),以及Word、Excel和PPT等文件'''
'''Python中open函数可以打开文件,语法如下:
open(file,model='r',encoding=None,errors=None)
file参数用于表示要打开的文件,可以是字符串或整数。
如果file是字符串,则表示文件名,文件名既可以是当前目录的相对路径,也可以是绝对路径
如果file是整数,则表示一个已打开的文件
model参数用于设置文件打开模式,用字符串表示,例如rb表示以只读模式打开二进制文件。
用于设置文件打开模式的字符串中每一个字符都表示不同的含义
t:以文本模式打开文件
b:以二进制文件模式打开文件
r:以只读模式打开文件
w:以只写模式打开文件,不能读内容。如果文件不存在,则创造文件,如果文件存在则覆盖内容
x:以独占创建模式打开文件,如果文件不存在,则创建并以写入模式打开;如果文件已存在,则引发FileExistsError异常
a:以追加模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件已存在,则在文件末尾追加
+:以更新(读写)模式打开文件,必须与r、w或a组合使用,才能设置文件为读写模式
上面这些字符可以进行过组合,以表示不同类型的文件打开模式:
字符串 说明
rt或r 以只读模式打开文本文件
wt或w 以只写模式打开文本文件
xt或x 以独占创建模式打开文本文件
at或a 以追加模式打开文本文件
rb 二进制文件模式,类似于rt
wb 二进制文件模式,类似于wt
xb 二进制文件模式,类似于xt
ab 二进制文件模式,类似于at
r+ 以读写模式打开文本文件,如果文件不存在则报错
w+ 以读写模式打开文本文件,如果文件不存在则创建文件
a+ 以追加文本模式打开文本文件,如果文件不存在则创建文件
rb+ 二进制文件模式,类似于r+
wb+ 二进制文件模式,类似于w+
ab+ 二进制文件模式,类似于a+
encoding参数用来指定打开文件时的编码,默认是UTF-8,主要用于打开文本文件
errors参数用来指定在文本文件发生编码错误时如何处理,
推荐errors参数的取值为ignore,表示在遇到编码错误时对其忽略,程序会继续执行
'''
f=open('测试.txt','w+',encoding='utf-8') #以读写模式打开文本文件,如果没有则创建
f.write('测试一下') #写入字符串【测试一下】
f=open('测试.txt','r+',encoding='utf-8') #以读写模式打开文本文件
f.write('hello') #为什么写入的是【hello幌?】?
f=open('测试.txt','a',encoding='utf-8') #以追加模式打开文本文件
f.write('追加')
f=open('C:\\Users\\llj\Documents\\Python\\测试3.txt','w+')
#采用普通字符串表示绝对路径文件名,其中的反斜杠【\】需要转义,另一个方法是将【\】改为【/】
f.write('ceshi')
fname='C:\\Users\\llj\Documents\\Python\\测试3.txt'
f=open(fname,'a+')
f.write('追加')
#a和a+模式的区别是,前者只能追加写入文件,而后者不仅可以追加写入文件,还能读取文件
#打开文件后,如果不再使用文件,应该将其关闭,需要用到close()方法
'''对文件的操作往往会抛出异常,为了保证对文件的操作无论是正常结束还是异常结束,都能够关闭文件,
我们应该将对close()方法的调用放在异常处理finally代码块中'''
f_name='text.txt'
f=None
try:
f=open(f_name) #可能引发FileNotFoundError异常
print('打开文件成功')
content=f.read() #可能引发OSError异常
print(content)
except FileNotFoundError as e:
print('文件不存在,请先创建')
except OSError as e:
print('处理OSError异常')
finally:
if f is not None:
f.close()
print('关闭成功')
'''Python提供了一个【with as】代码块,可以帮助自动释放资源(包括关闭文件的操作),
它可以替代finally代码块,优化代码结构,提高其可读性'''
f_name='测试.txt'
with open(fname) as f:
content=f.read()
print(content)
'''with as提供了一个代码块,在as后面声明一个资源变量,在with as代码块结束之后自动释放资源'''
'''读写文本文件的相关方法如下:
read(size=-1):从文件中读取字符串,size参数指限制读取的字符数量,size=-1表示没有限制
readline(size=-1):在读取到换行符或文件尾时返回单行字符串。如果已经到文件尾,则返回一个空字符串
readlines():读取文件数据到一个字符串列表中,每一行数据都是列表的一个元素
write(s):将字符串s写入到文件中,并返回写入的字符数
writelines(lines):向文件中写入一个字符串列表。不添加行分隔符,因此通常为每一行末尾都提供行分隔符。
flush():刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中
'''
print('--------------复制文本文件--------------------')
fname='C:\\Users\\llj\\Documents\\Python\\file\\文件1.txt'
with open(fname,'r',encoding='utf-8') as f:
lines=f.readlines()
copy_f_name='C:\\Users\\llj\\Documents\\Python\\file\\文件2.txt'
with open(copy_f_name,'w',encoding='utf-8') as copy_f_name:
copy_f_name.writelines(lines)
print('文件复制成功')
print('----------读写二进制文件------------------')
'''二进制文件的读写单位是字节,不需要考虑编码问题
二进制文件的主要读写方式如下:
read(size=-1):从文件中读取字节,size限制读取的字节数,如果size=-1则读取所有字节
readlines(size=-1):从文件中读取并返回一行。
readlines():读取文件数据到一个字节列表中,每一行数据都是列表的一个元素
write(b):写入b字节,并返回写入的字节数
writelines(lines):向文件中写入一个字节列表。不添加行分隔符,因此通常为每一行末尾都提供行分隔符
flush():刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中
'''
fname='C:\\Users\\llj\\Documents\\Python\\file\\logo.png'
with open(fname,'rb') as f: #rb代表以读写模式打开二进制文件
b=f.read()
copy_f_name='C:\\Users\\llj\\Documents\\Python\\file\\logo2.png'
with open(copy_f_name,'wb') as copy_f: #wb代表以只写模式打开二进制文件
copy_f.write(b)
print('文件复制成功')
'''
r和r+的区别:前者只能读取数据,不能写入,后者可以实现文件的读写
w和w+的区别:前者只能写入数据,不能读取,后者可以读写入数据
r+和w+也有区别,
r+如果是先读后写,会在原有内容的后面添加写入内容,因为读完时游标在文件最末尾,
如果是先写后读,是从头开始覆盖式写入,实际写多少内容,就覆盖多少内容。
写入完成后,游标停留在写完的位置而不是文件的末尾,此时再进行读取,可以读出未被新内容覆盖的文档内容
w+如果是先写后读,写完后游标就停留在文档的末尾,马上读的话什么内容都读取不到。
应使用f.seek(0)让游标回到初始位置后,在开始读取。
先读的话是读不出任何东西的,因为w+也是纯粹的覆盖写,在未使用写入操作前,无论之前该文件里有什么内容,已经被完全置空,是空白的。所以只能先写侯读
a和a+的区别:通过a只能写入数据(在文件后面追加),不能读取数据,通过a+则可以读取和写入数据
'''