Python学海无涯路【第16回】:文件的操作

本文详细介绍了Python中文件操作的各种方法,包括read、readline、readlines等读取方法,write、writelines等写入方法,以及seek、tell等文件定位方法。同时,还讲解了文件打开模式、自动关闭文件、二进制文件读写等高级技巧。


1、read

在这里插入图片描述

f=open("../Resource/test.txt",encoding="utf-8")
data=f.read()
print(data)
f.close()

输出:
无聊望见了犹豫 达到理想不太易
即使有信心 斗志却抑止
谁人定我去或留 定我心中的宇宙
只想靠两手向理想挥手
问句天几高心中志比天更高
自信打不死的心态活到老

f=open("../Resource/test.txt",encoding="utf-8")
data=f.read(2)
print(data)
f.close()

输出:无聊

2、readline

用于从文件读取整行,包括 “\n” 字符。

f=open("../Resource/test.txt",encoding="utf-8")
data=f.readline()
print(data,end='')
f.close()

输出:
无聊望见了犹豫 达到理想不太易

3、readlines

f=open("../Resource/test.txt",encoding="utf-8")
data=f.readlines()
print(data,end='')
f.close()

输出:
[‘无聊望见了犹豫 达到理想不太易\n’, ‘即使有信心 斗志却抑止\n’, ‘谁人定我去或留 定我心中的宇宙\n’, ‘只想靠两手向理想挥手\n’, ‘问句天几高心中志比天更高\n’, ‘自信打不死的心态活到老\n’]

4、readable

是否可读

f=open("../Resource/test.txt",encoding="utf-8")
print(f.readable())
f.close()

输出:
True

5、write

#“w”模式,打开文件,如果文件存在,会清空文件里的内容
f=open("../Resource/test.txt","w",encoding="utf-8")  
f.write("无聊望见了犹豫 达到理想不太易\n")
f.close()

在这里插入图片描述
只能写入字符串,不能写入整数,不然报错

f=open("../Resource/test.txt","w",encoding="utf-8")
f.write(1)  #文件内容只能是字符串
f.close()

输出:TypeError: write() argument must be str, not int

5、writeable

是否可写

f=open("../Resource/test.txt","w",encoding="utf-8")
print(f.writable())
f.close()

输出:
True

6、writelines

f=open("../Resource/test.txt","w",encoding="utf-8")
f.writelines(["无聊望见了犹豫 达到理想不太易\n","即使有信心 斗志却抑止\n"])
f.close()

在这里插入图片描述

7、追加模式

在这里插入图片描述

f=open("../Resource/test.txt","a",encoding="utf-8")
f.write("即使有信心 斗志却抑止\n")
f.close()

执行结果:
在这里插入图片描述

8、修改文件内容

在这里插入图片描述

src_f=open("../Resource/test.txt","r",encoding="utf-8")
data=src_f.readlines()
src_f.close()
des_f=open("../Resource/testNew.txt","w",encoding="utf-8")
des_f.writelines(data[0])
des_f.close()

结果:
在这里插入图片描述

9、自动close

with open("../Resource/test.txt","r",encoding="utf-8") as f:
    data=f.read() #执行完这句自动,执行f.close()
print(data)

10、打开多个文,自动close

with open("../Resource/test.txt","r",encoding="utf-8") as src_f, \
        open("../Resource/testNew.txt", "r", encoding="utf-8") as des_f:
    data=src_f.read()
    des_f.write(data)

11、rb

打开文件默认是t,即“r”模式默认是“rt”
对于视频、图片和其他文件,可以用b的模式打开

f=open("../Resource/test.txt", "rb")
data=f.read()
print(data)
print(data.decode(encoding="utf-8"))

输出:
b’\xe6\x97\xa0\xe8\x81\x8a\xe6\x9c\x9b\xe8\xa7\x81\xe4\xba\x86\xe7\x8a\xb9\xe8\xb1\xab \xe8\xbe\xbe\xe5\x88\xb0\xe7\x90\x86\xe6\x83\xb3\xe4\xb8\x8d\xe5\xa4\xaa\xe6\x98\x93\r\n’
无聊望见了犹豫 达到理想不太易

12、wb

f=open("../Resource/test.txt", "wb")
f.write("无聊望见了犹豫 达到理想不太易\n".encode(encoding="UTF-8"))
f.write(bytes("即使有信心 斗志却抑止\n",encoding="utf-8"))
f.close()

在这里插入图片描述

13、closed

判断文件是否关闭

f=open("../Resource/test.txt")
print(f.closed)		#False
f.close()
print(f.closed)		#True

输出:
False
True

14、encoding

获取的是open打开的编码,不是文件存的编码

f=open("../Resource/test.txt")
print(f.encoding)               #cp936其实就是GBK,IBM在发明Code Page的时候将GBK放在第936页,所以叫CP936
f.close()
f=open("../Resource/test.txt",encoding="utf-8")
print(f.encoding)
f.close()

输出:
cp936
utf-8

15、flush

将缓存数据写入磁盘

16、tell

在这里插入图片描述

f=open("../Resource/test.txt",encoding="utf-8")
print(f.tell())             #当前光标所在位置
f.readline()
print(f.tell())
f.close()

输出:
0
13

17、seek

17.1、seek移动的单位是字节

read(3)代表3个字符,其余的文件内光标移动都是以字节为单位如seek,
utf-8编码中一个汉字有3个字节

在这里插入图片描述

f=open("../Resource/test.txt",encoding="utf-8",newline="")
f.seek(1)
data=f.read()
print(data)
f.close()

输出报错:
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb8 in position 0: invalid start byte

原因:seek(1)表示一个字节,汉字utf-8表示三个字节,故报错

f=open("../Resource/test.txt",encoding="utf-8")
f.seek(3)
data=f.readlines()
print(data)
f.close()

输出:
[‘再犹豫\n’]

17.2、seek总是相对于文 件开始位置移动

f=open("../Resource/test.txt","r+",encoding="utf-8")
f.seek(12)
print(f.tell())
f.seek(3)		#seek总是相对于文 件开始位置移动
print(f.tell())
f.close()

输出:
12
3

17.3、seek的三种模式

17.3.1、默认为0模式

f=open("../Resource/test.txt","rb")  #以b模式打开不能用encoding
f.seek(12)          #seek默认用0模式
print(f.tell())
f.seek(3,0)         #0模式,即绝对位置
print(f.tell())
f.close()

17.3.2、1模式为相对们置

f=open("../Resource/test.txt","rb")  #以b模式打开不能用encoding
f.seek(12)          #seek默认用0模式
print(f.tell())
f.seek(3,1)         #1模式,即相对位置
print(f.tell())
f.close()

输出:
12
15

17.3.3、2模式相对于文 件末尾开始

在这里插入图片描述

f=open("../Resource/test.txt","rb")  #以b模式打开不能用encoding
f.seek(-5,2)     #相对于文件末尾开始,再向前移动5字节
print(f.tell())
data=f.read()
print(data)
f.close()

输出:
21
b’abc\r\n’

18、truncate

指定一个位置,并截断,截断后的内容被删除
在这里插入图片描述

f=open("../Resource/test.txt","r+",encoding="utf-8")
#打开模式不能是w+和w,因为这种模式会删除文件的内容
#删除了,就截取不了了
f.truncate(3)	#保留三个字节(即一个汉字),其余的全删除	
data=f.read()
print(data)
f.close()

输出:无
在这里插入图片描述

19、文件打开模式

模式描述
t文本模式 (默认)。
x写模式,新建一个文件,如果该文件已存在则会报错。
b二进制模式。
+打开一个文件进行更新(可读可写)。
U通用换行模式(不推荐)。
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

20、循环文件的推荐方式

在这里插入图片描述

f=open("../Resource/test.txt","r",encoding="utf-8")
#会一行一行从文件中读取,相对于f.readlines()等减少内存开销
for i in f:
    print(i,end="")

输出:
无聊望见了犹豫 达到理想不太易
即使有信心 斗志却抑止
谁人定我去或留 定我心中的宇宙
只想靠两手向理想挥手
问句天几高心中志比天更高
自信打不死的心态活到老

21、读取文件最后一行

在这里插入图片描述

f=open("../Resource/test.txt","rb")  #用seek时,要以b模式打开
for i in f:
    offset=-10                  #做个估算
    while True:
        f.seek(offset,2)
        data=f.readlines()
        if len(data)>1:
            print("文件的最后一行是:%s" %(data[-1].decode("utf-8")))
            break
        offset *= 2

输出:
文件的最后一行是:自信打不死的心态活到老

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值