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)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值