文件操作 IO技术
创建文件对象open()
open(文件名[,打开方式])
文件名可以是当前目录的文件名或者绝对路径
f = open(r"d:\b.txt",“w”)
打开方式:
- r:读 read 模式
- w:写 write 模式。如果文件不存在则创建;如果文件存在,则重写新内容;
- a:追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容
- b:二进制 binary 模式(可与其他模式组合使用)
- +:读、写模式(可与其他模式组合使用)
基本的文件写入操作
文本文件写入一般三步骤:
1、创建文件对象
2、写入数据
3、关闭文件对象
f = open(r"a.txt","a")
s = "itbaizhan\nsxt\n"
f.write(s)
f.close()
执行结果:
以下内容被增加到文本文件a.txt中
itbaizhan
sxt
常见的编码介绍
常用编码之间的关系如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Uf06SNn-1629040736423)(/Users/housong/Library/Application Support/typora-user-images/image-20210815123414810.png)]
windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。当我们 用 open()时,调用的是操作系统打开的文件,默认的编码是 GBK,会对中文字符出现乱码。
通过指定文件编码解决中文乱码问题:
#测试写入中文
f = open(r"b.txt","w",encoding="utf-8")
f.write("尚学堂\n 百战程序员\n")
f.close()
- 一般项目都是用的UTF-8编码。
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")
str = "gaoqiqi"
f.write(str)
except BaseException as e:
print(e)
finally:
f.close()
with 语句(上下文管理器)
with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出 with 块,都能 确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
s = ["高淇\n","高老三\n","高老五\n"]
with open(r"d:\bb.txt","w") as f:
f.writelines(s)
文本文件的读取
文件的读取一般使用如下三个方法:
- read([size])
从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。
读取到文件末尾,会返回空字符串。
- readline()
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。 3. readlines()
文本文件中,每一行作为一个字符串存入列表中,返回该列表。
pickle 序列化
-
pickle.dump(obj, file) #obj 就是要被序列化的对象,file 指的是存储的文件
-
pickle.load(file) 从 file 读取数据,反序列化成对象
CSV 文件的操作
csv.reader 对象
import csv
with open(r"d:\a.csv") as a:
a_csv = csv.reader(a) #创建 csv 对象,它是一个包含所有数据的列表,每一行为一个元素
headers = next(a_csv) #获得列表对象,包含标题行的信息
print(headers)
for row in a_csv: #循环打印各行内容
print(row)
执行结果:
['姓名', '年龄', '工作', '薪水']
['高淇', '18', '程序员', '50000']
['高老三', '19', '测试工程师', '20000']
['高老五', '20', '人工智能开发', '50000']
csv.writer 对象
import csv
headers = ["工号","姓名","年龄","地址","月薪"]
rows = [("1001","高淇",18,"西三旗 1 号院","50000"),("1002","高八",19,"西三旗 1 号院","30000")]
with open(r"d:\b.csv","w") as b:
b_csv = csv.writer(b) #创建 csv 对象
b_csv.writerow(headers) #写入一行(标题)
b_csv.writerows(rows) #写入多行(数据)
结果:
工号,姓名,年龄,地址,月薪
1001,高淇,18,西三旗 1 号院,50000
1002,高八,19,西三旗 1 号院,30000
os 模块-文件和目录操作
os 模块下常用操作文件的方法:
-
remove(path):删除指定的文件
-
rename(src,dest):重命名文件或目录
-
stat(path):返回文件的所有属性
-
listdir(path):返回 path 目录下的文件和目录列表
os 模块下关于目录操作的相关方法
-
mkdir(path):创建目录
-
makedirs(path1/path2/path3/… ) :创建多级目录
-
rmdir(path):删除目录
-
removedirs(path1/path2…):删除多级目录
-
getcwd():返回当前工作目录:current work dir
-
chdir(path):把 path 设为当前工作目录
-
walk():遍历目录树
-
sep:当前操作系统所使用的路径分隔符
os.path 模块
-
isabs(path):判断 path 是否绝对路径
-
isdir(path):判断 path 是否为目录
-
isfile(path):判断 path 是否为文件
-
exists(path):判断指定路径的文件是否存在
-
getsize(filename):返回文件的大小
-
abspath(path):返回绝对路径
-
dirname§:返回目录的路径
-
getatime(filename):返回文件的最后访问时间
-
getmtime(filename):返回文件的最后修改时间
-
walk(top,func,arg):递归方式遍历目录
-
join(path,*paths):连接多个 path
-
split(path):对路径进行分割,以列表形式返回
-
splitext(path):从路径中分割文件的扩展名
模块的导入
from…import 导入
使用 from…import 导入模块中的成员:
from 模块名 import 成员 1,成员 2,...
import 语句和 from…import 语句的区别
-
import 导入的是模块。from…import 导入的是模块中的一个函数/一个类。
-
如果进行类比的话:
- import 导入的是“文件”,我们要使用该“文件”下的内容,必须前面加“文件名称”。
- from…import 导入的是文件下的“内容”,我们直接使用这 些“内容”即可,前面再也不需要加“文件名称”了。
包(package)
当一个项目中有很多个模块时,需要再进行组织。我们将功能类似的模块放到一起, 形成了“包”。本质上,“包”就是一个必须有__init__.py 的文件夹.
导入 module_AA.py的方式如下:
-
import a.aa.module_AA
在使用时,必须加完整名称来引用,比如:a.aa.module_AA.fun_AA()
-
from a.aa import module_AA
在使用时,直接可以使用模块名。 比如:module_AA.fun_AA()
-
from a.aa.module_AA import fun_AA 直接导入函数
在使用时,直接可以使用函数名。 比如:fun_AA()
【注】
- from package import item 这种语法中,item 可以是包、模块,也可以是函数、
类、变量。
-
import item1.item2 这种语法中,item 必须是包或模块,不能是其他。
-
导入包的本质其实是“导入了包的__init__.py”文件。也就是说,”import pack1”意味 着执行了包 pack1 下面的__init__.py 文件。 这样,可以在__init__.py中批量导入我们需要 的模块,而不再需要一个个导入。
__init__.py 的三个核心作用:
1. 作为包的标识,不能删除。
2. 用来实现模糊导入
3. 导入包实质是执行__init__.py 文件,可以在__init__.py 文件中做这个包的初始化、以及 需要统一执行代码、批量导入。