【菜鸟零基础学习笔记】Day17-文件处理、b模式

本文参考资料链接:

python文件处理

 

【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默认处理文件用的是二进制方式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值