python学习笔记_第21天(文件操作--IO 技术)

使用pickle 序列化

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

CSV 文件的操作

与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 和os.path 模块

os 模块可以帮助我们直接对操作系统进行操作。可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等,是系统运维的核心基础。

  • os.system

可直接调用系统的命令

import os

os.system('notepad.exe')  # 代码执行完一条关闭所开资源后执行下一条
os.system('regedit')
os.system('cmd')  # 在下方命令窗口中打开终端窗口界面
os.system('ping www.baidu.com')  # 网页链接
  • os.startfile

直接调用可执行文件

# 直接调用可执行的程序/文件
os.startfile(r"C:\Program Files (x86)\MGTVPCC\芒果TV.exe")
  • os 模块-文件和目录操作

  • os 模块下常用操作文件的方法
方法名 描述
stat(path) 返回文件的所有属性
remove(path) 删除指定的文件
rename(原文件名,新文件名) 重命名文件或目录
listdir(path) 返回path 目录下的文件和子目录列表
  • os 模块下关于目录操作的相关方法
方法名 描述
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 模块

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

  • walk()递归遍历所有文件和目录

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)

你可能感兴趣的:(学习笔记,python)