文件操作(1)
一、文件操作概述
一个完整的程序一般都包括数据的存储和读取。前面写的程序数据都没有进行实际的存储,因此Python解释器执行完数据就消失了。实际开发中,经常需要从外部存储介质(硬盘、光盘、U盘等)读取数据,或者将程序产生的数据存储到文件中,实现"持久化"保存。
很多软件系统将数据存储到数据库中,数据库实际也是基于文件形式存储的。
文本文件和二进制文件
• 文本文件:存储普通"字符"文本,Python默认为unicode字符集(两个字节表示一个字符,最多可表示65536个),可以使用记事本程序打开。
• 二进制文件:把数据内容用"字节"进行存储,无法用记事本打开,必须使用专用的软件解码。常见的有:MP4视频文件、MP3音频文件、JPG图片、doc文档等。
二、文件操作相关模块概述
模块名称 | 说明 |
io模块 | 文件流的输入和输出操作(input/output) |
os模块 | 基本操作系统功能,包括文件操作 |
glob模块 | 查找符合特定规则的文件路径名 |
fnmatch模块 | 使用模式来匹配文件路径名 |
fileinput模块 | 处理多个输入文件 |
filecmp模块 | 用于文件的比较 |
csv模块 | 用于csv文件处理 |
pickle和cPickle | 用于序列化和反序列化 |
xml包 | 用于XML数据处理 |
bz2、gzip、zipfile、zlib、tarfile | 用于处理压缩和解压缩文件(分别对应不同的算法) |
三、创建文件对象open()
open()函数用于创建文件对象,基本语法格式:open(文件名[, 打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,如 D:\a\b.txt。为了减少\的输入,可以使用原始字符串:r"d:\b.txt"
f = open(r"d:\b.txt", "w")
打开方式如下表:
模式 | 描述 |
r | 读 read模式 |
w | 写 write模式。文件不存在则创建;文件存在则重写新内容 |
a | 追加 append模式。文件不存在则创建;文件存在则在文件末尾追加内容 |
b | 二进制 binary模式(可与其他模式组合使用) |
+ | 读、写模式(可与其他模式组合使用) |
• 如果没有增加模式 b,则默认创建的是文本文件对象,处理的基本单元是"字符"。
• 如果是二进制模式 b,则创建的是二进制文件对象,处理的基本单元是"字节"。
四、文本文件的写入
文本文件的写入一般就是三个步骤:
• 创建文件对象
• 写入数据
• 关闭文件对象
▶ 示例:文本写入操作简单测试
f = open(r"a.txt", "a")
s = "itbaizhan\nsxt\n"
f.write(s)
f.close()
▶ 示例:使用with上下文管理写入
with open(r"a.txt", "a") as f:
s = "itbaizhan\nsxt\n"
f.write(s)
五、常用编码介绍
在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。
ASCII
全称为 American Standard Code for Information Interchange,美国信息交换标准代码。用7位表示,只能表示128个字符。0~31表示控制字符;32~126表示打印字符。48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122为26个小写英文字母。
ISO8859-1
又称 Latin-1,是一个8位单字节字符集。把ASCII的最 高位也利用起来,并兼容了ASCII。在ASCII编码之上又增加了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。
GB2312 / GBK / GB18030
• GB2312:1980年发布,主要收录了6763个汉字、682个符号。完全兼容ISO8859-1。
• GBK:1995年制定,扩展了GB2312,一共收录了21003个汉字。
• GB18030:2000年发布,包含了中国大部分少数民族的语言字符,收录汉字数超过70000余个。向下兼容GB2312和GBK。
Unicode
Unicode编码设计成了固定两个字节,所有的字符都用16位(2^16=65536)表示,包括之前只占8位的英文字符等,所以会造成空间的浪费。Unicode完全重新设计,不兼容ISO8859-1,也不兼容任何其他编码。
UTF-8
UTF-8全称是 8-bit Unicode Transformation Format。编码兼容ISO8859-1,同时也可以用来表示所有语言的字符。UTF-8是不定长编码,每一个字符的长度从1-4个字节不等。其中,英文字母都是用一个字节表示,而汉字使用三个字节。
• 一般项目都会使用 UTF-8。
中文乱码问题
操作系统默认的编码:Windows是GBK,Linux是UTF-8。当用open()时,调用的是操作系统打开的文件,默认的编码是GBK。
▶ 示例:中文字符文件,乱码出现测试
#测试写入中文
f = open(r"b.txt", "w")
f.write("尚学堂\n百战程序员\n")
f.close()
▶ 示例:通过指定文件编码解决中文乱码问题
#测试写入中文
f = open(r"b.txt", "w", encoding="utf-8")
f.write("尚学堂\n百战程序员\n")
f.close()
六、write()/writelines()写入数据
• write(a):把字符串a写入到文件中
• writelines(b):把字符串列表写入文件中,不添加换行符
▶ 示例:添加字符串列表数据到文件中
f = open(r"d:\bb.txt", "w", encoding="utf-8")
s = ["高淇\n", "高老三\n", "高老四\n"]
f.writelines(s)
f.close()
七、close()关闭文件流
由于文件底层是由操作系统控制,打开的文件对象必须显式调用close()方法关闭。当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法),再关闭文件,释放文件对象。
为了确保打开的文件对象正常关闭,一般结合异常机制的finally或者with关键字实现无论何种情况都能关闭打开的文件对象。
▶ 示例:结合异常机制的finally,确保关闭文件对象
try:
f = open(r"my01.txt", "a")
s = "gaoqi"
f.write(s)
except BaseException as e:
print(e)
finally:
f.close()
八、with语句(上下文管理器)
with关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
▶ 示例:使用with管理文件写入操作
s = ["高淇\n", "高老三\n", "高老五\n"]
with open(r"d:\bb.txt", "w") as f:
f.writelines(s)
九、文本文件的读取
文件的读取一般使用如下三个方法:
• read([size]):从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件。读取到文件末尾,会返回空字符串。
• readline():读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
• readlines():文本文件中,每一行作为一个字符串存入列表中,返回该列表。
▶ 示例:读取一个文件前4个字符
with open(r"a.txt", "r", encoding="utf-8") as f:
print(f.read(4))
▶ 示例:文件较小,一次将文件内容读入到程序中
with open(r"d:\bb.txt", "r") as f:
print(f.read())
▶ 示例:按行读取一个文件
with open(r"bb.txt", "r") as f:
while True:
fragment = f.readline()
if not fragment:
break
else:
print(fragment, end="")
▶ 示例:使用迭代器(每次返回一行)读取文本文件
with open(r"d:\bb.txt", "r") as f:
for a in f:
print(a, end="")
▶ 示例:为文本文件每一行的末尾增加行号
with open("b.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
lines2 = [line.rstrip() + " #" + str(index) + "\n" for index, line in zip(range(1, len(lines) + 1), lines)]
with open("b.txt", "w", encoding="utf-8") as f:
f.writelines(lines2)
上一篇:文件操作(2)
下一篇:python基础概念


