Python基础之文件的读写(全网最详细)

java程序员从零开始学pyhton,从入门到大神 。

本系列教程基于Python3

目录

一、文件的介绍

1、文本文件

2、二进制文件

二、打开文件

1、打开文件

2、代码实例:

三、读文件

1、读文本文件

2、读二进制文件

四、写文件

1、写文本文件

2、写二进制文件

3、文件copy

五、读写位置处理

1、获取当前位置

2、设置读写位置

六、资源释放

七、编解码问题

1、编码

2、解码

一、文件的介绍

在计算机中所有的文件应当称作是二进制文件,因为文件的储存形式都是二进制的。但是根据文件的用途和表现形式的差异,人们通常还是会把文件分为文本文件和二进制文件这两种。

1、文本文件

文本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符'\n'结尾。常规字符串是指记事本或其他文本编辑器能正常显示、编辑并且人类能够直接阅读和理解的字符串,如英文字母、汉字、数字字符串。文本文件只能存字符,无法存视频、音频、图片等。

其文本文件的实质还是二进制文件,只不过文本文件中所有的字节都可以通过已有的字符集映射为人类可读的字符。

2、二进制文件

二进制文件把对象内容以字节串(bytes)进行存储,无法用记事本或其他普通文字处理软件直接进行编辑,通常也无法被人类直接阅读和理解,需要使用专门的软件进行解码后读取、显示、修改或执行。比如图片、音频、视频、可执行文件、PDF、各类office文档等都属于二进制文件。

注意:二进制文件可以处理任何数据,当中在编程中我们要根据自己的操作对象,选择合适的处理方式。

二、打开文件

1、打开文件

在python中使用open()函数打开文件,如果该文件不能被打开(文件不存在、访问权限不够、磁盘空间不足或其他原因),则引发 OSError。

open(file, mode='r', buffering=-1, encoding=None, errors=None,
     newline=None, closefd=True, opener=None)
 
'''
file:指定被打开的文件路径。
mode:指定打开文件后的处理方式。
buffering:指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的大小。
默认值-1表示由系统管理缓存。
encoding:指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,
如GBK、utf8、CP936等等。
errors:指定如何处理编码和解码错误,只适用于文本模式。
newline:指定换行符。
opener:用来实现自定义打开文件的方式
'''

文件打开模式:

模式描述文件不存在时文件存在时
r只读模式(默认,可省略)抛出异常正常只读打开,指针在开头
w覆盖写模式创建新文件清空原有内容,重新写入
x创建写模式创建新文件抛出异常
a追加写模式创建新文件在文件末尾追加内容,指针在结尾
b二进制模式——(需与其他模式组合使用)——
t文本模式(默认,可省略)——(需与其他模式组合使用)——
+读/写模式——(需与其他模式组合使用)——
rb二进制只读抛出异常二进制只读打开,指针在开头
r+读写模式抛出异常读写打开,指针在开头
w+读写模式创建新文件清空原有内容,重新读写
a+读写追加模式创建新文件读写打开,指针在结尾,追加写入

2、代码实例:

# 只读的模式
f = open("D:\\text.txt", "r", encoding="utf-8")
txt = f.read()
print(txt)
f.close()

# 打开一个文件用于读写,文件指针将会放在文件的开头
f2 = open("D:\\text.txt", "r+", encoding="utf-8")
txt = f2.read()
print(txt)
f2.close()

三、读文件

读文件就是将磁盘中某个文件的内容读到内存中。

文件读入方法描述代码实例
.read([size])读入全部内容;若给出参数 size,则只读入前 size 个字符/字节。txt = f.read(2)
.readable()测试当前文件对象是否可读(返回布尔值)。注意:无 size 参数。flag = f.readable()
.readline([size])读取一行内容作为字符串返回;若给出 size,则最多读取该行前 size 个字符。txt = f.readline()
.readlines([hint])读入所有行,以每行为元素返回列表;若给出 hint,则最多读入 hint 行。txt = f.readlines()

1、读文本文件

# 只读的模式
f = open("D:\\text.txt", "r", encoding="utf-8")
if not f.readable():  # 判断当前文件是否可读
    raise FileExistsError("文件不可读")
txt = f.read()  # 全部读出
print(txt)
f.close()  # 关闭文件流

2、读二进制文件

# 只读的模式
f = open("D:\\mp4.mp4", "rb") # rb:二进制文件的只读模式
if not f.readable():  # 判断当前文件是否可读
    raise FileExistsError("文件不可读")
txt = f.read() # 全部读出
print(txt)
f.close()  # 关闭文件流

四、写文件

写文件就是将内存中的数据写入磁盘文件中

文件写入方法描述代码实例(示例)
.write(s)将字符串 s 的内容写入文件。f.write("我是程序员小吏")
.writelines(lines)将字符串列表 lines 写入文件,不会自动添加换行符f.writelines(["中国", "美国", "俄国"])
.writable()测试当前文件对象是否可写(返回布尔值)。注意:无参数。flag = f.writable()
.seek(offset[, whence])移动文件操作指针的位置。f.seek(0) # 回到文件开头

1、写文本文件

# 打开一个文件用于读写,如果该文件以存在则将其覆盖,如果该文件不存在,创建新文件
f = open("d:\\text.txt", "w+", encoding="utf-8")  # 写入文件
f.write("我是程序员小吏")  # 写入内容
f.close()  # 关闭文件

2、写二进制文件

# wb:打开一个二进制文件用于写
f = open("d:\\text.bin", "wb")
# 以二进制格式写入
f.write(b'Hello, world!') 
# 编码字符串为UTF-8字节并写入
f.write('我是程序员小吏!'.encode('utf-8'))
# 关闭文件流
f.close() 

3、文件copy

文件读写学会之后,我们就可以完成一个需求:把a.txt 的内容copy到b.txt中

f_read = open("d:\\a.txt", "r", encoding="utf-8")
f_write = open("d:\\b.txt", "w", encoding="utf-8")
line = f_read.readline()
f_read.seek(0)  # 这里一定要把文件指针给重置
while line != '':  # 判断文件是不是读取结束
    # 咱们选择一行一行的复制
    line = f_read.readline() 
    f_write.write(line)
f_read.close()
f_write.close()

当然在实际工作中我们一般不用手写文件的copy,可能更多的是采用其内置库 shutil中提供的两个方法。copy( )  或 copy2( )


import shutil

source_file = 'd:\\a.txt'
destination_file = 'd:\\b.txt'
# 复制文件内容
shutil.copy(source_file, destination_file)

# 不仅复制文件内容,还会尽量保留文件的元数据(如最后修改时间等)
# shutil.copy2(source_file, destination_file)

五、读写位置处理

1、获取当前位置

tell():这个函数的返回值是当前文件指针的位置,返回的是从头开始到此时文件指针的位置所经历过的总字节数(偏移字节数)

f_read = open("d:\\a.txt", "r", encoding="utf-8")
line = f_read.readline()
print("一行位置偏移量=",f_read.tell()) # 一行位置偏移量= 25
f_read.close()

如代码执行结果,一行是25个字节。所以偏移量是25。

“我是程序员小吏-1” 这是一行的内容,其中“1”占一个字节,其他八个字符各占3个字节(utf-8)。所以最终的偏移量是25。

2、设置读写位置

f.seek(offset, whence) 方法用于移动文件指针到指定位置。

  • offset:开始的偏移量,也就是代表需要移动偏移的字节数,必要参数
  • whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。默认为0,所以seek(0)和f.seek(0,0)没有区别。

需求:直接从第三行开始读,也就是忽略前两行。

六、资源释放

操作文件属于操作系统行为,如果我们打开文件,但是最后不关闭这个文件,第一回占用系统资源,第二可能导致缓冲区的数据不能全部写入文件中。所以编码时一定要执行 file.close() 操作。

try:
    f = open('d:\\a.txt', 'r')
    
    # 业务逻辑
    
    f.close()  # 释放资源
except FileNotFoundError:
    print('找不到文件')
except Exception as e:
    print(e.args)

在python中我们通常使用“上下文管理器” with 关键字来处理资源释放问题,比如文件操作、网络连接、数据库连接等。with 语句的核心是在一定范围内自动处理资源的获取和释放。

# with 自动处理资源问题
with open('d:\\a.txt', 'r',encoding="utf8") as f:
    print(f.read())

七、编解码问题

程序员永远饶不过去的一个问题就是,编码与解码的问题,因为计算机存储的是人看不懂的二进制数据,但电脑是给人用的,所以无论是展示给人看的数据,还是人输入给计算机的数据都是人能看懂的。所以就需要一个桥梁去链接人与计算机的交互。

1、编码

定义:编码是指将原始信息转换成特定格式的过程。人输入的数据各种各样,文字、图片、视频、pdf等等,但计算机只认二进制格式,所以在计算机中编码就是将字符转为二进制格式

转换过程:把一个字符先根据某种编码方式转化为对应的数字,然后这个数字再转化为二进制数字(为了操作方便,通常转化为16进制传给计算机)

# 1、编码函数 encode
data_str = ("中国")
data_bin = data_str.encode("gbk")
print("gbk编码=",data_bin)  # gbk编码= b'\xd6\xd0\xb9\xfa'
data_bin = data_str.encode("utf-8")
print("utf-8编码=",data_bin) # utf-8编码= b'\xe4\xb8\xad\xe5\x9b\xbd'

# bytes 函数也可以编码
byte1 = bytes(data_str, "gbk")
byte2 = bytes(data_str, "utf-8")

2、解码

定义:解码是指将特定格式的数据转换成原始信息的过程。计算机把自己存储的二进制数据转换成字符、图片、视频、PDF等等。所以在计算机中解码就是二进制数据转换为原始数据

# decode 解码
decode1=b'\xd6\xd0\xb9\xfa'.decode("gbk")
decode2=b'\xe4\xb8\xad\xe5\x9b\xbd'.decode("utf-8")
print("gbk解码=",decode1) # gbk解码= 中国
print("utf-8解码=",decode2) # utf-8解码= 中国
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小吏

赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值