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

作者:大梦三千秋 时间:2023-07-08 12:15:06 

文件数据读写

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

文件读取

使用 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].

来源:https://segmentfault.com/a/1190000021642805

标签:Python,文件,读写
0
投稿

猜你喜欢

  • Python读取properties配置文件操作示例

    2021-06-10 04:20:55
  • 为什么mysql自增主键不是连续的

    2024-01-19 06:59:53
  • Mysql安装 Navicat 出现1044/1045错误的解决方法

    2024-01-15 18:13:30
  • mysql8.0.30安装配置最详细教程(windows 64位)

    2024-01-16 10:01:35
  • 在C#和MySQL中存取中文字符时避免乱码的方法

    2024-01-15 13:59:02
  • typecho统计博客所有文章的字数实例详解

    2023-06-13 07:52:36
  • 教你怎么用Python实现多路径迷宫

    2022-03-11 15:07:52
  • Golang编译器介绍

    2024-05-02 16:26:01
  • 浅析JavaScript中的常用算法与函数

    2024-05-03 15:32:53
  • mysql 5.7.23 winx64解压版安装教程

    2024-01-26 01:41:09
  • python实现3D地图可视化

    2023-08-27 10:24:50
  • Python中super函数用法实例分析

    2023-12-05 14:36:19
  • thinkPHP引入类的方法详解

    2024-06-05 09:45:55
  • vue+elementUi图片上传组件使用详解

    2024-05-10 14:14:49
  • 用 Python 连接 MySQL 的几种方式详解

    2023-07-25 08:08:50
  • python机器学习实战之最近邻kNN分类器

    2021-11-11 14:55:52
  • 简单介绍Ruby中的CGI编程

    2022-09-07 21:38:14
  • MySQL安装配置方法教程

    2024-01-21 23:35:30
  • C#使用正则表达式实例

    2024-05-13 09:16:48
  • OpenCV实现图片亮度增强或减弱

    2022-09-16 00:15:04
  • asp之家 网络编程 m.aspxhome.com