Python 文件数据读写的具体实现


Posted in Python onJanuary 24, 2020

文件数据读写

读写文件,本质上是请求操作系统打开一个文件对象,然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。

文件读取

使用 Python 内置 open() 函数,以 rt 的模式读取文件,如下示例:

>>> f = open('some.txt', 'rt')

这行代码就表示打开一个文件,若是文件不存在,会抛出 IOError 的异常,并给出详细的信息提示:

>>> f = open('undefined.txt', 'rt')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'undefined.txt'

当成功打开文件时,可使用 read() 函数读取文件的内容:

>>> f.read()
'Hello world!'

当数据读取完毕后,需要调用 close() 关闭文件。因为文件对象会占用资源,使用完毕后需要及时关闭释放资源。

>>> f.close()

还有一种方法就是使用 with 语句,给被使用的文件创建一个上下文环境,这样文件对象就能够自动关闭。

>>> with open('some.txt', 'rt') as f:
...   data = f.read()
...

调用 read() 时一次性读取全部内容,若是文件内容过大,可以使用 read(size) 固定大小循环读取,每次最多读取 size 字节的内容。readline() 函数,每次读取一行内容,readlines() 读取所有内容,但是按行返回 list。三者的使用,可根据实际的需求进行选择。

二进制文件

读取二进制的文件,需要使用 rb 的模式打开:

>>> f = open('image.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00...'

从文件中读取数据,需要注意编码的问题。当编码错误时,会抛出 UnicodeDecodeError 异常。比如:

>>> f = open('some.txt', 'rt', encoding='ascii')
>>> f.read()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/local/lib/python3.6/encodings/ascii.py", line 26, in decode    
  return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 2: ordinal not in range(128)

这种情况下,通常为读取文本指定的编码不正确,需要确认文件编码是否正确。如果编码错误还是存在的话,可以给 open() 函数传递一个可选的 errors 参数来处理这些错误。比如:

>>> f = open('some.txt', 'rt', encoding='ascii', errors='replace') 
>>> f.read()
'Un��ic��o��de��'
>>> f = open('some.txt', 'rt', encoding='ascii', errors='ignore') 
>>> f.read()
'Unicode'

使用参数 errors 能够处理编码错误的问题,但是过程会觉得非常糟糕。这里提倡的是确保使用的是正确的编码。模棱两可的时候,使用默认的设置(通常是 UTF-8)。

压缩文件

读取 gzip 和 bz2 格式的压缩文件时,可以使用 gzip 和 bz2 模块。两个模块都为 open() 提供了另外的实现来解决读取 gzip 和 bz2 两个格式的压缩文件的问题。例如读取压缩文件,示例如下:

>>> import gzip
>>> with gzip.open('some.gz', 'rt') as f: 
...   text=f.read()
   
>>> import bz2
>>> with bz2.open('some.bz2', 'rt') as f:
...   text=f.read()

文件写入

文件写入,同样需要调用 open() 参数,但是指定的模式为 wt 或者 wb,用以表示写文本文件或是二进制文件:

>>> f = open('some.txt', 'wt')
>>> f.write('Hello, world!')
13
>>> f.close()

数据写入完毕,同样需要调用 close() 关闭文件对象。也可以 with 语句创建上下文,用以正常关闭文件对象。

类似的,写入压缩数据时,导入 gzip 或者 bz2 模块:

>>> import gzip
>>> with gzip.open('some.gz', 'wt') as f: 
...   f.write(text)
   
>>> import bz2
>>> with bz2.open('some.bz2', 'wt') as f:
...   f.write(text)

写入压缩数据时,可选参数 compresslevel 可以指定一个压缩等级。例如:

>>> with gzip.open('some.gz', 'wt', compresslevel=6) as f:
...   f.write(text)

compresslevel 参数默认值为 9,表示最高的压缩等级。等级越低性能越好,但是压缩程度也就越低。

使用 w 模式的 open() 函数,若打开的文件在写入前有数据内容,则会被清除覆盖。如果是要在已经存在的文件中添加内容的话,使用模式为 at 的 open() 函数。

涉及读写文件模式的定义及含义,内容如下:

模式 含义
'r' 读取数据(默认)
'w' 写入数据
'x' 文件存在抛出异常,不存在则创建
'a' 追加写入数据
'b' 二进制模式
't' 文本模式(默认)
'+' 更新文件(读写)

具体更详细的内容可以参考 Python 官方文档。

参考资料

来源
David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O'Reilly Media.2013.
Luciano Ramalho.Fluent Python.O'Reilly Media.2015.
“2. Built-in Functions”.docs.python.org.Retrieved 20 January 2020.
"gzip — Support for gzip files".docs.python.org.Retrieved 22 January 2020.
"bz2 — Support for bzip2 compression".docs.python.org.Retrieved 22 January 2020.
廖雪峰.“Python 教程”.liaoxuefeng.com.[2020-01-18].

以上为本篇的主要内容。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基于twisted实现简单的web服务器
Sep 29 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
Python实现的生成格雷码功能示例
Jan 24 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
Python global全局变量函数详解
Sep 18 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
python使用requests模块实现爬取电影天堂最新电影信息
Apr 03 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
Django分组聚合查询实例分享
Apr 29 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 #Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 #Python
keras 特征图可视化实例(中间层)
Jan 24 #Python
基于keras输出中间层结果的2种实现方式
Jan 24 #Python
tensorflow 保存模型和取出中间权重例子
Jan 24 #Python
tensorflow 模型权重导出实例
Jan 24 #Python
在Tensorflow中查看权重的实现
Jan 24 #Python
You might like
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
jquery 无限级联菜单案例分享
2013/03/26 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
基于python生成器封装的协程类
2019/03/20 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
tensorflow 变长序列存储实例
2020/01/20 Python
Python设计密码强度校验程序
2020/07/30 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
师德个人剖析材料
2014/02/02 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
调查研究项目计划书
2014/04/29 职场文书
IT工程师岗位职责
2014/07/04 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
商家认证委托书格式
2014/10/16 职场文书
毕业实习感受与体会
2015/05/26 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS