Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
pickle.dump(obj, file) # obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) # 从file 读取数据,反序列化成对象
# 将对象序列化到文件中
import pickle
with open(r"pickle.dat", "wb") as f:
a1 = "python"
a2 = 123
a3 = ['a', 'b', 'c']
pickle.dump(a1, f)
pickle.dump(a2, f)
pickle.dump(a3, f)
# 将获得的数据反序列化成对象
with open(r"pickle.dat", "rb") as f:
b1 = pickle.load(f) # 存入与取出的顺序需一致,先存入的先被取出
b2 = pickle.load(f)
b3 = pickle.load(f)
print(b1)
print(b2)
print(b3)
print(id(a1))
print(id(b1)) # 反序列化的值与原对象相同,但id不同,是一个新建的对象
执行结果:
python
123
[‘a’, ‘b’, ‘c’]
3019697409200
3019698575024
与Excel 文件不同,CSV 文件中:值没有类型,所有值都是字符串。不能指定字体颜色等样式,不能指定单元格的宽高,不能合并单元格。
Python 标准库的模块csv 提供了读取和写入csv 格式文件的对象。
# csv.writer 对象写一个csv 文件
import csv
headers = ["工号", "姓名", "年龄", "地址", "月薪"]
rows = [["1002", "李四", 25, "北京", "10000"], ["1003", "王五", 22, "深圳", "8000"]] # 列表中每行记录为列表是csv文件在对象中的存储方式
with open(r"a.csv", "w",newline='') as f: # windows下newline默认为换行符,即输入一行数据会默认空一行,可设置newline不换行
f_csv = csv.writer(f) # 创建csv 对象
f_csv.writerow(headers) # 写入一行(标题)
f_csv.writerow(["1001", "张三", 18, "上海", "5000"]) # 单行写入数据
f_csv.writerows(rows) # 写入多行(数据)
# csv.reader 对象于从csv 文件读取数据
with open(r"a.csv", 'r') as f:
f_csv = csv.reader(f) # 创建csv 对象,它是一个包含所有数据的列表,每一行为一个列表元素存储在列表中
print(f_csv)
print(list(f_csv)) # [['工号', '姓名', '年龄', '地址', '月薪'], ['1001', '张三', '18', '上海', '5000'], ['1002', '李四', '25', '北京', '10000'], ['1003', '王五', '22', '深圳', '8000']]
with open(r"a.csv", 'r') as f:
f_csv = csv.reader(f)
for row in f_csv: # 循环打印各行内容
print(row)
执行结果:
<_csv.reader object at 0x000002B6D6F3CC18>
[[‘工号’, ‘姓名’, ‘年龄’, ‘地址’, ‘月薪’], [‘1001’, ‘张三’, ‘18’, ‘上海’, ‘5000’], [‘1002’, ‘李四’, ‘25’, ‘北京’, ‘10000’], [‘1003’, ‘王五’, ‘22’, ‘深圳’, ‘8000’]]
[‘工号’, ‘姓名’, ‘年龄’, ‘地址’, ‘月薪’]
[‘1001’, ‘张三’, ‘18’, ‘上海’, ‘5000’]
[‘1002’, ‘李四’, ‘25’, ‘北京’, ‘10000’]
[‘1003’, ‘王五’, ‘22’, ‘深圳’, ‘8000’]
os 模块可以帮助我们直接对操作系统进行操作。可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等,是系统运维的核心基础。
可直接调用系统的命令
import os
os.system('notepad.exe') # 代码执行完一条关闭所开资源后执行下一条
os.system('regedit')
os.system('cmd') # 在下方命令窗口中打开终端窗口界面
os.system('ping www.baidu.com') # 网页链接
直接调用可执行文件
# 直接调用可执行的程序/文件
os.startfile(r"C:\Program Files (x86)\MGTVPCC\芒果TV.exe")
方法名 | 描述 |
---|---|
stat(path) | 返回文件的所有属性 |
remove(path) | 删除指定的文件 |
rename(原文件名,新文件名) | 重命名文件或目录 |
listdir(path) | 返回path 目录下的文件和子目录列表 |
方法名 | 描述 |
---|---|
sep | 当前操作系统所使用的路径分隔符 |
linesep | 当前操作系统所使用的换行符 |
getcwd() | 返回当前工作目录:current work dir |
chdir(path) | 把path设为当前工作目录 |
mkdir(path) | 创建目录 |
makedirs(path1/path2/path3/…) | 创建多级目录 |
rmdir(path) | 删除目录(条件:空目录) |
removedirs(path1/path2…) | 删除多级目录(条件:空目录) |
# 测试os 模块中,关于文件和目录的操作
import os
# 获取文件和文件夹相关的信息
print(os.name) # 操作系统:windows->nt linux 和unix->posix
print(os.sep) # 分隔符:windows->\ linux 和unix->/
print(repr(os.linesep)) # 换行符:windows->\r\n linux-->\n\;repr() 函数将对象转化为供解释器读取的形式。
print(os.stat(r"..\pickle.py")) # 获取指定文件的信息,../指的是上一级目录
# 关于工作目录的操作
print(os.getcwd()) # 返回当前的工作目录
os.chdir("..") # 改变当前的工作目录为指定目录
os.mkdir("书籍") # 在已指定的工作目录下创建一个子目录
os.rmdir("书籍")
# 创建目录、创建多级目录、删除
os.mkdir("书籍") # 在当前工作目录下创建一个子目录
os.rmdir("书籍") # 相对路径都是相对于当前的工作目录
os.makedirs("电影/港台/警匪")
os.rename("电影", "movie") # 文件/目录重命名
dirs = os.listdir("movie") # 展示当前目录下的一级子目录
print(dirs) # 一级子目录下的内容不展示
os.removedirs("movie/港台/警匪") # 只能删除空目录
os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作
方法 | 描述 |
---|---|
isabs(path) | 判断path 是否绝对路径 |
isdir(path) | 判断path 是否为目录 |
isfile(path) | 判断path 是否为文件 |
exists(path) | 判断指定路径的文件是否存在 |
getsize(filename) | 返回文件的大小 |
abspath(path) | 返回path或当前工作路径与文件连接起来 |
dirname(path) | 返回目录的路径 |
getctime(filename) | 返回文件的创建时间 |
getatime(filename) | 返回文件的最后访问时间 |
getmtime(filename) | 返回文件的最后修改时间 |
split(path) | 对路径进行分割,以列表形式返回 |
splitext(path) | 从路径中分割文件的扩展名 |
join(path,*paths) | 连接多个path |
# 测试os.path 常用方法
import os
import os.path
# 获得目录、文件基本信息
print(os.path.isabs(r"E:\working\Pycharm_project\Python_primary\Day_21\os_modular")) # 是否绝对路径,True
print(os.path.isdir("../a.csv")) # 是否目录,False
print(os.path.isfile("../a.csv")) # 是否文件,True
print(os.path.exists("../a.csv")) # 文件是否存在,True
print(os.path.getsize("../a.csv")) # 文件大小,99
print(os.path.abspath("../a.txt")) # 输出绝对路径,当文件不存在也不报错
print(os.path.dirname(r"E:\working\Pycharm_project\Python_primary\Day_21\os_modular\a.csv")) # 输出所在目录
# 获得创建时间、访问时间、最后修改时间
print(os.path.getctime("../a.csv")) # 返回创建时间
print(os.path.getatime("../a.csv")) # 返回最后访问时间
print(os.path.getmtime("../a.csv")) # 返回最后修改时间
# 对路径进行分割、连接操作
path = os.path.abspath("a.txt")
print(os.path.split(path)) # 返回元组:(目录,文件名.后缀)
print(os.path.splitext(path)) # 返回元组:(路径,.后缀)
print(os.path.join("aa", "bb", "cc")) # 返回路径:aa\bb\cc
执行结果:
True
False
True
True
99
E:\working\Pycharm_project\Python_primary\Day_21\a.txt
E:\working\Pycharm_project\Python_primary\Day_21\os_modular
1612614575.7759595
1612617824.3058853
1612617823.9624052
(‘E:\\working\\Pycharm_project\\Python_primary\\Day_21\\os_modular’, ‘a.txt’)
(‘E:\\working\\Pycharm_project\\Python_primary\\Day_21\\os_modular\\a’, ‘.txt’)
aa\bb\cc
# 列出指定目录下所有的.py 文件,并输出文件名
import os
os.chdir('..')
path = os.getcwd() # 获取当前工作目录
file_list = os.listdir(path) # 列出子目录和子文件列表,可迭代对象
for filename in file_list:
if filename.endswith('py'):
print(filename, end="\t")
print('')
file_list2 = [filename2 for filename2 in os.listdir(path) if filename2.endswith(".py")] # 生成器
for filename2 in file_list2:
print(filename2, end="\t")
执行结果:
csv_modular.py pickle.py
csv_modular.py pickle.py
os.walk()方法:
返回一个3 个元素的元组,(dirpath, dirnames, filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
# 使用walk()递归遍历所有文件和目录
import os
all_files = [] # 文件地址存放列表
os.chdir('..') # 更改上级目录为当前目录
path = os.getcwd() # 获取当前工作目录
list_files = os.walk(path) # ctrl+单击walk,可以查看函数介绍和源代码
for dirpath, dirnames, filenames in list_files: # os.walk()方法返回一个3个元素的元组,(dirpath,dirnames,filenames)
for dir in dirnames: # 目录下的所有文件夹
all_files.append(os.path.join(dirpath, dir))
for name in filenames: # 目录下的所有文件
all_files.append(os.path.join(dirpath, name))
# 打印子目录和子文件
for file in all_files:
print(file)