1、文件操作相关模块概述
2、创建文件对象open()
open()函数用于创建文件对象,基本语法格式如下:
open(文件名 [,打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:\a\b.txt。
为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:
f = open(r"d:\b.txt", “w”)
其中文本文件对象和二进制文件对象的创建:
如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。
3、文本文件的写入
文本文件的写入一般分为三个步骤:
1、创建文件对象
2、写入数据
3、关闭文件对象
举例:
# 文本写入操作简单测试
f = open(r"d:\ss.txt", "a")
s = "kdx\nSSS\n"
f.write(s)
f.close()
4、常用编码介绍
常用编码之间的关系如下:
5、中文乱码问题
windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。当我们用 open()时,调用的是操作系统打开的文件,默认的编码是 GBK
举例:通过指定文件编码解决中文乱码问题
# 文本写入操作简单测试
f = open(r"d:\ss.txt", "w", encoding="utf-8")
s = "孔德新\n跃见非凡\n"
f.write(s)
f.close()
6、write()/writelines()写入数据
write(a):把字符串a写入到文件中去
writelines(b):把字符串列表写入文件中,不添加换行符
举例:添加字符串列表到文件中
# 添加字符串列表数据到文件中
f = open(r"d:\ss.txt", "w", encoding="utf-8")
s = ["莫愁前路无知己,长安谁人不识君\n", "寄万里长鸿,愿君岁无忧\n", "二十四桥的月亮\n"]
f.writelines(s)
f.close()
测试结果:
7、close()关闭文件流
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用 close()方法关闭文件对象**。当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush()方法),再关闭文件,释放文件对象。**
为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现无论何种情况都能关闭打开的文件对象。
举例:结合异常机制finally确保关闭文件对象
try:
f = open(r"d:\ss.txt", "a")
str1 = "kdx && qqq"
f.write(str1)
except BaseException as e:
print(e)
finally:
f.close()
8、with语句(上下文管理器)
with关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,并且可以在代码执行完毕后自动还原进入该代码块的现场。
举例:使用with管理文件写入操作
# 使用with管理文件写入操作
s = ["莫愁前路无知己,长安谁人不识君\n", "寄万里长鸿,愿君岁无忧\n", "二十四桥的月亮\n"]
with open(r"d:\ss.txt", "w") as f:
f.writelines(s)
测试结果:
9、文本文件的读取
文件的读取一般使用如下三个方法:
1、read([size])
从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件。读取到文件末尾,会返回空的字符串。
2、readline()
读取一行内容作为结果返回,读取到文件末尾,会返回空的字符串。
3、readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表。
举例1:
# 测试文本文件的读取
with open(r"d:\ss.txt", "r", encoding="GBK") as f:
print(f.read(4))
print("---------------------------")
with open(r"d:\ss.txt", "r", encoding="GBK") as f:
print(f.read())
print("---------------------------")
with open(r"d:\ss.txt", "r", encoding="GBK") as f:
for i in f:
print(i, end="")
print("---------------------------")
with open(r"d:\ss.txt", "r", encoding="GBK") as f:
print(f.readlines()) # 每一行作为一个字符串存入列表中,返回该列表
举例2:
# 为文本文件每一行的末尾增加行号
# 先读文件
with open(r"d:\ss.txt", "r", encoding="GBK") as f:
lines = f.readlines()
lines = [line.rstrip() + " #" + str(index) + "\n" for index, line in enumerate(lines, 1)] # 推导式生成列表
# 再写文件
with open(r"d:\ss.txt", "w", encoding="GBK") as f:
f.writelines(lines)
10、二进制文件的读取和写入
二进制文件的处理流程和文本文件流程一致,首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出文件对象。例如:
f = open(r"d:\ss.txt", ‘wb’) # 可写的、重写模式的二进制文件对象
f = open(r"d:\ss.txt", ‘ab’) # 可写的、追加模式的二进制文件对象
f = open(r"d:\ss.txt", ‘rb’) # 可读的二进制文件对象
创建好二进制对象后,仍然可以使用write()、read()等函数实现文件的读写操作。
举例:读取图片文件,实现文件的拷贝
with open("cc.jpg", 'rb') as f:
with open("cc_copy.jpg", 'wb') as w:
for line in f.readlines():
w.write(line)
print('图片拷贝完成!')
测试结果:
11、文件对象的常用属性和方法
文件对象的属性
文件对象的打开模式
文件对象的常用方法
12、文件任意位置操作
举例:使用seek()函数方法移动文件指针
# seek()函数移动文件指针示例
with open("ss.txt", "r", encoding="utf-8") as f:
print("文件名是:{0}".format(f.name))
print(f.tell()) # 返回文件指针的当前位置
print("读取的内容:{0}".format(str(f.readline())))
print(f.tell())
f.seek(0, 0) # 把文件移动到新的位置,第一个0代表相当于第二个值有多少个字节的偏移量
print("读取的内容:{0}".format(str(f.readlines())))
13、使用pickle序列化
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。
反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。
主要方法:
举例:将对象序列化到文件中
# 将对象序列化到文件中
import pickle
with open(r"d:\data.dat", "wb") as f:
a1 = "张三"
a2 = 456
a3 = [123, 211, "sss"]
pickle.dump(a1, f)
pickle.dump(a2, f)
pickle.dump(a3, f)
# 将获得的数据反序列化成对象
with open(r"d:\data.dat", "rb") as f:
a1 = pickle.load(f)
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1)
print(a2)
print(a3)
测试结果:
将对象序列化到文件中,如图所示:
将获得的数据反序列化成对象,如图所示:
14、CSV文件的操作
**CSV(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。**与 Excel 文件不同,CSV 文件中:
1、值没有类型,所有值都是字符串
2、不能指定字体颜色等样式
3、不能指定单元格的宽高,不能合并单元格
4、没有多个工作表
5、不能嵌入图像图表
Python 标准库的模块CSV提供了读取和写入CSV格式文件的对象
15、csv.read对象和csv文件的读取
举例:csv.reader 对象于从 csv 文件读取数据
# csv.reader 对象于从csv文件读取数据
import csv
with open("aa.csv") as a:
a_csv = csv.reader(a) # 创建csv对象,它是一个包含所有数据的列表,每一行为一个元素
headers = next(a_csv) # 获得列表对象,包含标题行的信息
print(headers)
for i in a_csv: # 循环打印各行内容
print(i)
测试结果:
16、csv.writer对象和csv文件的写入
举例:csv.writer 对象写一个 csv 文件
# csv.write对象写一个csv文件
import csv
headers = ["工号", "姓名", "年龄", "地址", "月薪"]
rows = [("2000", "李一", 20, "安徽", 50000), ("4000", "李二", 24, "江苏", 70000), ("6000", "李四", 29, "西藏", 90000)]
with open("bb.csv", "w") as b:
b_csv = csv.writer(b) # 创建csv对象
b_csv.writerow(headers) # 写入一行(标题)
b_csv.writerows(rows) # 写入多行(数据)
测试结果:
17、os 和 os.path模块
os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。
(1)os 模块-调用操作系统命令
例1:os.system 调用 windows 系统的记事本程序
import os
os.system("notepad.exe")
运行结果:
例2:os.system 调用 windows 系统中ping命令
import os
os.system("ping www.baidu.com")
运行结果:
注:控制台输出中文可能会有乱码问题,可以在 file–>setting 中设置:如下图所示:
例3:os.startfile :直接调用可执行文件
举例:运行安装好的微信
import os
os.startfile(r"D:\Program Files (x86)\Tencent\WeChat\WeChat.exe")
测试结果:
(2)os 模块-文件和目录操作
我们可以通过前面讲的文件对象实现对于文件内容的读写操作。如果,还需要对文件和目录做其他操作,可以使用 os 和 os.path模块。
os 模块下常用操作文件的方法
os 模块下关于目录操作的相关方法,汇总如下:
举例: