【open()】
三步骤:
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r(只读模式),注意不要漏了encoding这个参数,没有写解码方式可能会报错(不过mac默认utf-8,不写不报错)
#2. 通过句柄对文件进行操作
data=f.read()
#3. 关闭文件
f.close()
文件以二进制的形式储存在硬盘中,要把文字变成二进制,中间需要选择某种编码类型。pycharm默认把文件按utf-8格式转换成二进制格式,储存在硬盘中。如果使用open函数打开文件的时候没有指定encoding这一条,pycharm会默认按系统的编码进行解码,而windows系统的编码是gbk。一个按utf-8格式编码的文件,无法用gbk格式解码,所以会报错。
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
【readable()】
判断文件是否为只读模式
f=open('a.txt','r',encoding='utf-8')
print(f.readable()) #True
【readline()】
含义:一次读一行
example1:
f=open('a.txt','r',encoding='utf-8')
print('第1行',f.readline(),end='') #end=''指的是不要换行
print('第2行',f.readline())
print('第3行',f.readline())
print('第4行',f.readline())
注意:如果readline()的行数大于文件里数据的行数,不会报错
example2:
f=open('a.txt','r',encoding='utf-8')
data = f.read()
print(f.readline()) #这时读不出来因为前一句已经将整个文档读完了
【w模式(只写)】
f = open('陈粒','w',encoding ='utf-8') #只写模式
f.read() #报错 不能读
f.close()
注意:只写模式下,如果文件存在,则会清空原有文件,再进行下面的操作;如果文件不存在,则新建文件
【write()】
f = open('陈粒','w',encoding ='utf-8')
f.write('12345\n') #要自己加换行符
f.write('67890\n')
f.close
f = open('陈粒','r',encoding ='utf-8')
print(f.read())
输出:
12345
67890
【writable()】
f = open('陈粒','w',encoding ='utf-8')
f.writable()
【writelines()】
f.writelines(['555\n','666\n']) #装在一个列表中
f.writelines(['555\n','666\n',1]) #报错(只能写字符串)
【添加模式'a'】
将内容添加到原来的文件的最后一个位置上(不一定是最后一行)
f = open('陈粒','a',encoding ='utf-8')
f.write('last sentence')
【r+模式】
r+模式(既可以读取也可以写入)
f = open('file_name','r+',encoding = 'utf-8')
data = f.read()
print(data)
f.write('add a sentence') #从光标的位置开始写入,会覆盖文件中原来的数据
【修改文件】
example1:
#把test2中的全部数据取出,并把test2中的第一行数据写入test2_new
a = open('test2','r',encoding='gbk')
data=a.readlines() #data是一个列表
a.close()
b = open('test2_new','w',encoding='gbk')
b.write(data[0]) #data[0]是一个字符串
b.close()
example2:
a = open('test2','r',encoding='gbk')
data=a.readlines() #data是一个列表
a.close() #把test2中的数据取出并将文件关闭
b = open('test2','w',encoding='gbk')
b.write(data[0]) #data[0]是一个字符串
b.close() #将需要的数据覆盖到原来的test2文件上,达到了修改文件的效果
【with open】
有关键词with的情况下不用写close语句,系统就会自动关闭之前打开的文件
src_f = open('xxx','r',encoding='gbk')
dst_f = open('xxx_new','w',encoding='gbk')
=================等价于=================
with open('xxx','r',encoding='gbk') as src_f,\ #要加斜杠才能换行
open('xxx_new','w',encoding='gbk') as dst_f:
【rb模式(用二进制读取文件内容)】
test2的内容是:
hello
10086
hi
你好
用rb模式读取内容:
f = open('test2','rb')
print(f.read())
输出为:
b'hello\r\n10086\r\nhi\r\n\xe4\xbd\xa0\xe5\xa5\xbd'
如果要看解码之后的内容,可以用decode()函数
f = open('test2','rb')
data = f.read()
print(data.decode('utf-8'))
f.close()
修改后的test2:
hello
10086
hi
你好
关于“print(data.decode('utf-8'))”这句语句的解释:
文件中的字符串转换成二进制要进行编码(encode);
二进制转换成字符串要进行解码(decode)
所以上述语句用的是“decode”而不是“encode”
【wb类型(用二进制写入数据)】
原test2内容:
hello
10086
hi
你好
wb模式下打开文件并写入:
f = open('test2','wb')
f.write(bytes('123456\n',encoding='utf-8')) #写入的数据内容为bytes形式,不能写字符串
f.write('杨建'.encode('utf-8')) #还可以直接用encode
f.close()
修改后的test2:
123456
杨建
【ab类型】
原test2内容:
123
你好
hello
ab模式下打开文件并写入:
f = open('test2','ab')
f.write(bytes('123456\n',encoding='utf-8'))
f.write('杨建'.encode('utf-8'))
f.close()
修改后的test2:
123
你好
hello123456
杨建
b模式的好处:
1、除了可以处理text(文本)类型的文件,还可以处理图片、视频等类型的文件
2、在各种操作系统中都能用
3、linux默认处理文件用的是二进制方式