python | 使用open读写文件

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: python | 使用open读写文件

在目前的环境中,读取文件应该算是最基本的操作了,python也内置了读写文件的函数,让我们来看下。这里有个小点要点一下,我们使用python是没法办直接操作文件的,而是操作系统给我们预留了接口,python通过操作系统接口才能去读写文件。


还是提及一点,编写这篇文章的python版本为:

image.png



最简单读取文件操作


python中,直接使用open方法就可以打开文件对象了。


open函数需要传入的参数为open(文件名,模式,编码),其中文件名必须要指定文件名。


例如,我们想打开files.txt文件,可以这么写:

f = open("files.txt")

这样的话,我们就得到了一个文件句柄f。而直接调用f.read()即可读取所有信息,例如:

我们有个文件,内容如下:

image.png


我们可以使用如下代码进行读取:

f = open("files.txt")
print(f.read())

结果如下:

image.png



操作一次文件读写完整流程


上述代码简单吧,但是也是有缺陷的,在于操作完毕后,没有关闭文件句柄,此操作可能会引起数据丢失,因为我们的数据不是直接存到磁盘的,而是写到缓冲器,等量够了之后,再进行写入磁盘操作。


但是等我们在执行close操作时,会强制将缓冲器的内容写到磁盘中去。

所以完整的读写流程为:

  • 使用open打开文件
  • 进行读写操作
  • 完毕后需要close文件


基本代码为:

f = open("files.txt")
# 文件读写操作
f.close()

还会有这样的一种情况,就是文件读写过程中出现异常了,抛错,导致文件执行不到f.close(),此时就没办法做关闭句柄的动作。


这个时候,我们就可以使用with open() as f的方式来进行打开文件操作,with语句会在底层做关闭句柄操作,即使触发异常,也会正常关闭句柄。



文件打开方式


还记得第一段落所提及的open打开的模式么? 其实指的是文件的打开方式,默认是只读模式,即: r,除此之外,还有其他的方式,例如:


  • r: 文件以只读方式打开(也是默认模式)。
  • w: 文件以写入方式打开,会重置文件。
  • x: 创建一个新文件且写入。
  • a: 追加写入(如果文件存在,会在末尾进行追加)。
  • b: 文件以二进制打开。
  • t: 文件以文本模式打开(也是默认模式)。
  • +: 打开文件进行更新(可读可写)。

上述模式是可以叠加的,例如默认的: rt



如果模式不正确,则会抛错,例如,我们使用默认的rt打开一个已有文件,进行write写入:

f = open("files.txt","rt")
print(f.readline())
f.write("123")

执行后发现,其实f.readline已经执行成功了,而f.write失败了,报错为没有writeable


image.png

此时我们若将权限修改为r+,则就不会报错,我们试试看

程序修改为:

image.png

执行后查看文件

image.png


可以看到123已经追加到文件中了,只不过没有换行。



python提供的读取方法有何意义


在上述段落中,我们已经有了文件句柄f,关于读取有如下几种方法:


  • readlines: 一次性读取所有行,然后将其按照列表的形式返回。
  • readline: 每次读取一行,直至空。
  • read: 读取全部数据并且返回。


readlines会读取所有的行,并且按照列表的形式返回,例如:

f = open("files.txt","r")
print(f.readlines())
f.close()


上述代码会将files.txt全部读取完,并且按照换行作为分隔符,进行拆分数据,并且按照列表的形式进行返回。

执行后效果为:

image.png


read则会读取全部数据并且返回,当然了,read还能接收参数,例如read(10)就是读取10个字节数据,默认是全部,例如:

f = open("files.txt","r")
print(f.read())
f.close()

执行后效果为:

image.png

对于readline来说,它会读取一行文件,我们可以结合with语句来操作,可以避免close。如何使用open...with配合readline读取所有的行呢? 可以使用如下代码实现:

with open("files.txt","r+") as f:
    while True:
        line = f.readline()
        if not line:
            break
        print(line)

上述代码中,我们使用了while True来进行死循环,将文件读取完毕后,就退出循环。



小案例: 扫描redis配置文件


我们将使用python读取文件操作,对redis.conf进行读取,将排查掉配置文件的空行和注释行,并且将剔除配置文件之后的配置写入到新文件中newRedis.conf


注意: redis使用#进行注释配置,例如:


cat redis.conf
# 这是注释
bind 0.0.0.0 # 这也是注释

由于该配置文件实在是太长了,所以,我们随机选择一段进行操作:


image.png

我们可以先使用写方式打开新文件newRedis.conf,而后使用以只读方式打开redis.conf,而后逐行扫描,如果遇到空行,或者开头为#的就直接略过,如果上述2者都不是,则是配置文件,注意配置文件是否包含注释符号#,如果包含的话,需要略过#之后的数据。

image.png



上述代码引入了re库进行处理,其中match代表匹配字符串行首,^$代表空行,而后再在配置文件中判断#是否出现在语句中,如果出现,再使用元组将第一个#配置前的数据抓出来。


最后将抓出的配置写入文件中即可。


执行脚本后,查看newRedis.conf文件

image.png


总结


本篇文章介绍了python读写文件,更推荐使用with open的方式,因为它底层会调用close方法,而不需要我们自己去写调用close方法。


最后我们写了一个小案例来屏蔽redis注释和空行,仅读取配置文件。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
安全 Python
Python中文件操作的详细使用:open()、os.open()和with open()
Python中文件操作的详细使用:open()、os.open()和with open()
90 0
|
1月前
|
安全 Python
解释一下Python中with open()语句的工作原理。
【2月更文挑战第10天】【2月更文挑战第28篇】解释一下Python中with open()语句的工作原理。
|
3月前
|
Python
python中 open() 和 File()
在Python中,open()是内置函数,而File是类。它们的区别和理解如下: 1. open()函数:open()函数用于打开一个文件,并返回一个文件对象。它有以下几个参数:
33 2
|
8月前
|
Python
Python 文件操作 with open()
Python 文件操作 with open()
55 0
|
9月前
|
JSON 数据格式 Python
Python中对open读取文件内容时的mode模式解析
Python中对open读取文件内容时的mode模式解析
95 0
|
10月前
|
Python
25.从入门到精通:Python3 File方法 open() 方法 file 对象
25.从入门到精通:Python3 File方法 open() 方法 file 对象
|
11月前
|
数据库连接 数据处理 Python
翻开Python的宝匣:深度解析open()函数,解锁更多操作技巧。
翻开Python的宝匣:深度解析open()函数,解锁更多操作技巧。
|
Docker Python 容器
解决docker 2022-11-16 14:54:26 python: can‘t open file ‘/src/main.py‘: [Errno 2]
解决docker 2022-11-16 14:54:26 python: can‘t open file ‘/src/main.py‘: [Errno 2]
131 0
|
数据采集 存储 缓存
python open函数文本操作详解
python open函数文本操作详解
python open函数文本操作详解
|
Python
【Python open()函数】
【Python open()函数】
106 0