Python 开发程序中,读写文件是最常见的功能,基本的调用方法也很简单,但细节方面却不见得大家都能了解。所以,本文除了介绍基本用法外,还会介绍那些大家容易忽视的细节。同时,也会介绍特殊文件:音频、压缩、PDF 、Excel 、图片、plist 等对应的模块。
基本用法
文件 是用于存储数据的连续字节集,这些数据会以特定格式组织,最后这些字节文件被翻译成二进制文件,以 1
和 0
的方式被计算机处理。
Python 对普通的文件的处理,已经内置到内部模块里了,所以,可以直接使用,这也说明了对文件读写是多么基础的功能了。
代码示例:
# 打开文件的读描述符
file = open('./test.txt', 'r')
pass
# 关闭打开的文件
file.close()
但需要特别注意的是,文件在使用完成后一定要关闭,避免导致各种权限异常错误,即使是在过程中出现异常导致程序崩溃。
常见的处理方式是使用 with
,会在完成后自动关闭文件。
代码示例:
with open('./test.txt', 'r') as file:
pass
其效果就如同下面的代码示例:
file = open('./test.txt', 'r')
try:
pass
finally:
file.close()
读
代码示例:
with open('./test.txt', 'r') as f:
# 一次性全部读出来,在读取文章类文件时,比较方便
# 如果文件过大时,可以使用 read(size),由 size 控制读取的大小,再迭代读取全部内容
print(f.read())
# 一次读取所有内容并按行返回 list ,在读取配置文件、日志时,比较方便
for line in f.readlines():
print(line)
# 每次读取一行内容,在文件很大时,可以有效节省内存占用
for line in f.readline():
print(line)
注意阅读代码里的注释,说明了使用的方式。
写
代码示例:
with open('./test.txt', 'w') as f:
f.write('Hello World!')
f.write('\n')
相比读,写的使用方式就很简单了,就是 write 函数。
文件打开方式
Python 的文件读取默认都是 ASCII 编码的文本文件,但并不是所有的文件的都是 ASCII 编码的(比如:图片、视频等),所以我们需要能够二进制文件的功能。
所以,这里整理了一份文件打开方式的说明表格:
模式符号 | 打开方式 | 起始位置 |
---|---|---|
r | 只读(默认模式) | 在文件开头,文件不存在则报错 |
rb | 二进制格式只读) | 在文件开头,文件不存在则报错 |
r+ | 可读可写 | 在文件开头,文件不存在则报错 |
rb+ | 二进制格式可读可写 | 在文件开头,文件不存在则报错 |
w | 只写 | 文件存在,则覆盖;不存在,则创建 |
wb | 二进制格式只写 | 文件存在,则覆盖;不存在,则创建 |
w+ | 可读可写 | 文件存在,则覆盖;不存在,则创建 |
wb+ | 二进制格式可读可写 | 文件存在,则覆盖;不存在,则创建 |
a | 追加 | 文件存在,在文件尾追加;不存在,则创建 |
ab | 二进制格式追加 | 文件存在,在文件尾追加;不存在,则创建 |
a+ | 可读可写 | 文件存在,在文件尾追加;不存在,则创建 |
ab+ | 二进制格式可读可写 | 文件存在,在文件尾追加;不存在,则创建 |
如果读取的是非 ASCII 编码的文本文件,就必须使用二进制方式打开,再进行解码。
代码示例:
with open('./test.txt', 'rb') as f
print(f.read().decode('gbk')
特殊文件
在日常处理中会遇到各种特殊的文件,其实就是不同的编码格式,我们没有必要重新发明轮子,使用对应的库,就可以正常处理这类文件。
我在这里整理了一份特殊文件对应的库:
- csv:读写CSV文件
- wave:读写WAV文件(音频)
- aifc:读写AIFF和AIFC文件(音频)
- sunau:读取和写入Sun AU文件
- tarfile:读取和写入tar归档文件
- zipfile:使用ZIP存档
- configparser:轻松创建和解析配置文件
- xml.etree.ElementTree:创建或读取基于XML的文件
- msilib:读取和写入Microsoft Installer文件
- plistlib:生成并解析Mac OS X .plist文件
- PyPDF2:PDF工具包
- xlwings:读取和写入Excel文件
- Pillow:图像阅读和操作
最后,安利大家一本我写的掘金小册《深入理解NLP的中文分词:从原理到实践》,让你从零开始掌握中文分词技术,踏入NLP的大门。
如果因为以上内容对你有所帮助,希望你能够点赞、转发、评论,多谢多谢!
此公众号每周分享一篇干货文章,实实在在把一个课题说明白,讲清楚,望关注!