Python基础知识_day10_文件操作_pickle模块_os模块_shutil模块
文章目录
- 1. 文本文件和二进制文件
- 2. 创建文件对象 open()
- 3. 文本文件的写入
- 3.1 write()/writelines()写入数据
- 3.2 with语句
- 4. 文本文件的读取
- 5. 二进制文件的读取和写入
- 6. tell() & seek()
- 7. 使用pickle序列化
- 8. CSV文件的操作
- 9. os模块
- 9.1 文件和目录操作
- 9.2 os模块下关于目录操作的相关方法
- 9.3 os.path
- 10 . shutil模块
- 10.1 拷贝文件
- 10.2 拷贝文件夹
- 10.3 压缩
1. 文本文件和二进制文件
按文件中数据组织形式,我们把文件分为文本文件和二级制文件两大类。
- 文本文件
文本文件存储的是普通“字符”文本,默认为unicode字符集,可以使用记事本程序打开。但是,像word软件编辑的文档不是文本文件。
- 二进制文件
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4视频文件、MP3音频文件、JPG图片、doc文档等等。
2. 创建文件对象 open()
- open()函数用于创建文件对象,基本语法格式如下:
open(文件名,打开方式)
- 打开方式中,如果没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。
3. 文本文件的写入
- 三个步骤
1)创建文件对象
2)写入数据
- 关闭文件对象
3.1 write()/writelines()写入数据
write(a): 把字符串a写入文件中
writelines(b): 把字符串列表写入文件中,不添加换行符
f = open('test.txt','w',encoding='utf-8')
s = ['alex\n','john\n','peter\n','皓']
f.writelines(s)
f.close()
3.2 with语句
不论什么原因跳出with块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。
s = 'alex\njohn\npeter\n皓'
with open('test.txt','w',encoding='utf-8') as f:f.write(s)
4. 文本文件的读取
文件的读取一般使用如下三个方法:
- read(size)
从文件中读取size,并作为结果返回。如果没有size参数,则读取整个文件。
with open('test.txt','r',encoding='utf-8') as f:print(f.read(5))print(f.read(3)) ##执行完前一句后,光标停留在第五个字符后面,再次读取的时候从第六个字符开始读
- readline()
with open('test.txt','r',encoding='utf-8') as f:print(f.readline())print(f.readline())
# 第一行,f.readline()完成后最后一个字符是 ‘\n’,此时光标已经定位到了下一行的第0个位置
# print函数end默认为换行,因此每打印一行会空一行,相当于输入了两次换行。
- readlines()
with open('test.txt','r',encoding='utf-8') as f:print(f.readlines()) # 一行一行的读取,存放在列表中# ['alex\n', 'john\n', 'peter\n', '皓']
- 使用迭代器(每次返回一行)读取文本文件
with open('test.txt','r',encoding='utf-8') as f:for i in f:print(i)
# 本质就是一行一行进行读取
# 相当于 print(f.readline())
# print(f.readline())
- 练习:在每一行后面加上行号
with open('test.txt','r',encoding='utf-8') as f:lines = f.readlines()lines = [f'{line.strip()} #{index}\n' for index,line in enumerate(lines)]
with open('test.txt','w',encoding='utf-8') as f:f.writelines(lines)
enumerate() 函数:对于一个可迭代的对象,enumerate将其组成一个索引序列,利用它可以同时获得索引和值,函数返回的是一个enumerate对象
list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1):print(index, item)
# 0 这
# 1 是
# 2 一个
# 3 测试
5. 二进制文件的读取和写入
二进制文件的处理流程和文本文件流程一致。首先还是要创建文本对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。
- 需求:实现图片的拷贝
with open('aa.gif','rb') as f:with open('aa_copy.gif','wb') as w:for line in f.readlines():w.write(line)
6. tell() & seek()
- tell 查看光标
f = open("test.txt","a",encoding="utf-8")
f.write("太美")
print(f.tell()) # 结果为字节数
- seek(offset,whence) 移动光标
把文件指针移动到新的位置,offset表示相对于whence的多少个字节的偏移量
offset: 为正往结束方向移动,为负往开始方向移动
whence不同的值代表不同含义
0:从文件头开始计算(默认值)
1:从当前位置开始计算
2:从文件尾开始计算
with open("test.txt","r",encoding="utf-8") as f:print(f'文件名是{f.name}') #文件名是test.txtprint(f'指针的位置是{f.tell()}') #指针的位置是0print(f'读取的内容是{f.readline()}') #读取的内容是Tomorrowf.seek(3)print(f'读取的内容是{f.readline()}') #读取的内容是orrow
7. 使用pickle序列化
将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式的过程称为序列化;反之,则称为反序列化。pickle是一个二进制序列化格式。
序列化我们使用:
pickle.dump(obj,file) #obj就是要被序列化的对象,file指的是存储的文件
pickle.load(file) #从file读取数据,反序列化成对象
- 将对象序列化存在文件中
import pickle
with open('data.dat','wb') as f:a1 = 'alex'a2 = 234a3 = [1,2,3]pickle.dump(a1,f)pickle.dump(a2,f)pickle.dump(a3,f)
- 将获得的数据反序列化成对象
import picklewith open('data.dat','rb') as f:a1 = pickle.load(f)a2 = pickle.load(f)a3 = pickle.load(f)print(a1)print(a2)print(a3)
8. CSV文件的操作
csv是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。与Excel文件不同,CSV文件中:
- 值没有类型,所有值都是字符串
- 不能指定字体颜色等样式
- 不能指定单元格的宽高,不能合并单元格
- 没有多个工作表
- 不能嵌入图像表格
Python标准库的模块csv提供了读取和写入csv格式文件的对象
我们在excel中建立一个简单的表格:
姓名 | 年龄 | 工作 | 薪水 |
---|---|---|---|
张三 | 18 | 程序员 | 12000 |
李四 | 20 | 测试工程师 | 13000 |
王五 | 25 | 人工智能开发 | 18000 |
另存为“csv(逗号分隔),我们打开查看这个csv文件内容:
姓名,年龄,工作,薪水
张三,18,程序员,12000
李四,20,测试工程师,13000
王五,25,人工智能开发,18000
- reader()函数
import csv
with open('name.csv','r') as f:print(csv.reader(f)) #<_csv.reader object at 0x000001DE25F73E80>#reader()函数返回的是一个迭代器,支持list转化和for循环
- csv文件读取
import csv
with open('name.csv','r') as f:a_csv = csv.reader(f)for row in a_csv:print(row)
# ['姓名', '年龄', '工作', '薪水']
# ['张三', '18', '程序员', '12000']
# ['李四', '20', '测试工程师', '13000']
# ['王五', '25', '人工智能开发', '18000']
- csv文件写入
with open('ee.csv','w',encoding='GBK') as f:b_csv = csv.writer(f)b_csv.writerow(['ID','姓名','年龄'])b_csv.writerow(['1001','Alex','18'])b_csv.writerows([['姓名', '年龄', '工作', '薪水'],['张三', '18', '程序员', '12000'],['李四', '20', '测试工程师', '13000'],['王五', '25', '人工智能开发', '18000']])print(help(csv.writer))
9. os模块
os模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等。
9.1 文件和目录操作
os模块下常用操作文件的方法
方法名 | 描述 |
---|---|
remove(path) | 删除指定的文件 |
rename(src,dest) | 重命名文件或目录 |
stat(path) | 返回文件的所有属性 |
listdir(path) | 返回path目录下的文件和目录列表 |
9.2 os模块下关于目录操作的相关方法
方法名 | 描述 |
---|---|
mkdir(path) | 创建目录 |
makedirs(path1/path2/path3/…) | 创建多继目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2/path3/…) | 删除多级目录(需要目录为空才可以删除) |
getcwd() | 返回当前工作目录:current work dir |
chdir(path) | 把path设为当前工作目录 |
walk() | 遍历目录树 |
sep | 当前操作系统所使用的路径分隔符 |
import os
print(os.getcwd())
# D:\数据统计py文件os.makedirs('../music/hongkong') #../指的是上一级目录os.rename('123','one')
9.3 os.path
方法名 | 描述 |
---|---|
isabs(path) | 判断path是否绝对路径 |
isdir(path) | 判断path是否为目录 |
isfile(path) | 判断path是否为文件 |
exists(path) | 判断指定路径的文件或文件夹是否存在 |
getsize(path) | 返回文件的大小 |
abspath(path) | 返回绝对路径 |
dirname(abspath) | 返回目录的路径,参数为绝对路径 |
getatime(path) | 返回文件的最后访问时间 |
getmtime(path) | 返回文件的最后修改时间 |
join(path,*path) | 连接多个path |
split(abspath) | 对路径进行分割,以列表形式返回,参数为绝对路径 |
basename(abspath) | 返回文件名,参数为绝对路径 |
- os.path.isabs()
import os
print(os.path.isabs(r'D:\day17\代码和笔记\01 今日内容.py'))
#True
print(os.path.isabs(r'01 今日内容.py'))
#False
- os.path.join()
#将数据写入指定文件中
import os
print(os.path.join('aa','bb','cc')) #aa\bb\ccpar_path = os.path.dirname(__file__) #动态获取当前工作目录
path = os.path.join(par_path,'data','ly') #拼接路径,data文件夹要先建立好
with open(path,'w',encoding='utf-8') as f1: #文件操作,没有文件会建立文件,但是路径不能建立,因此要先建立好data文件夹f1.write('今夜消费998')
- os.path.split(abspath)
print(os.path.split(r'D:\day17\代码和笔记\01 今日内容.py'))
#('D:\\day17\\代码和笔记', '01 今日内容.py')
#将path分割成目录和文件名二元组返回 ***
#需要给出绝对路径才能进行split操作
- os.path.dirname(abspath)
print(os.path.dirname(r'D:\day17\代码和笔记\01 今日内容.py'))
#D:\day17\代码和笔记
#返回path的目录。其实就是os.path.split(path)的第一个元素 。即:获取父级目录
#同样地也是需要给出绝对路径才可以
- os.path.basename(abspath)
print(os.path.basename(r'D:\day17\代码和笔记\01 今日内容.py'))
#01 今日内容.py
#返回path最后的文件名,获取文件名
#同样地也是需要给出绝对路径才可以
10 . shutil模块
文件、目录的拷贝和压缩
10.1 拷贝文件
shutil.copy('exercise.py','exercise_copy.py')
10.2 拷贝文件夹
shutil.copytree('movie/港台','电影')
#将<movie/港台文件夹>下的<文件夹及文件>拷贝到<电影>文件夹下
- 设置ignore参数
通过设置ignore参数,设置哪些类型的文件不拷贝
import shutilshutil.copytree('movie/港台','电影',ignore =shutil.ignore_patterns('*.txt','*.html'))
10.3 压缩
shutil.make_archive()
import shutilshutil.make_archive('电影/gg','zip','movie/港台')
#第一个参数为压缩包存放的位置
#第二个参数为压缩包的形式
#第三个参数为要压缩的文件夹
Python基础知识_day10_文件操作_pickle模块_os模块_shutil模块相关推荐
- python基础3之文件操作、字符编码解码、函数介绍
内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...
- 第三章:Python基础の函数和文件操作实战
本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...
- Python基础7:文件操作
[ 文件操作] 1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧 ...
- Python基础知识之文件的读取操作
读取文件的操作步骤 有一道脑筋急转弯,问把大象装进冰箱的步骤,答案很简单,打开冰箱.把大象推进去.关闭冰箱.这就是一个处理问题的思路,我们对文件的操作和这个一样,第一步:打开文件:第二部:处理文件(读 ...
- Python基础 2.1 文件操作
2.1 文件 文章目录 2.1 文件 2.1.1 文件的打开和关闭 1.文件的操作流程 2.打开文件 2.关闭文件 3.自动关闭文件(记忆) 2.1.2 文件的读写操作 1.文件的写操作 2.文件的读 ...
- 简单 Python 快乐之旅之:Python 基础语法之文件操作专题
文章目录 1. 读取文本文件 1.1. 读取文本文件里的个别字符 1.2. 以文本模式读取文件 2. 向文本文件写入字符串 2.1. 将字符串写入文本文件 2.2. 在文本模式下将字符串写入文本文件 ...
- python基础之写文件操作
博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏. ...
- Python基础_09:文件操作
文章目录 文件概念和作用 文件类型 文件操作流程 文件读取方式 文件写入方式 Tips: 文件其他方法 文件复制 补充部分 文件指针 f.seek()应用 修改文件的两种方式: 文件概念和作用 什么是 ...
- python基础一 day6 文件操作
读写只会进行两步, r+模式下写读 seek是按字节去找的 for line in f: for循环是一行一行的读取出来 strip默认去空格和换行符 空格.制表符.换行符.回车.换页垂直制表符和换行 ...
最新文章
- 【Todo】Java的JIT机制
- 转载:T-SQL语句大全
- NTU生活:NTU景点
- linux基本知识学习
- TCL 中upvar 用法 (摘自http://www.cnblogs.com/kane1990/archive/2011/12/19/2293981.html)
- 逗号后面统一加空格_用99个空格来提取Excel单元格数据,真的是脑洞大开!!!...
- The Use Case Definition in UML
- 计算机网络技术-----==一些东西
- 11. JavaScript 对象
- 定时器Quartz和插件pageHelper使用
- 课程作业记录10:63位PN码序列扩频通信Matlab仿真
- DirectX Repair v4.2.0.40217 最新2022全能运行库系统修复工具增强版
- java integer集合排序_Java集合中List的Sort()方法进行排序
- 2020年9月程序员工资统计,平均14469元
- SpringMVC-狂神笔记
- unix/Linux系统下的nobody用户与nologin详细介绍
- 技术人生:高山仰止,景行观止,虽不能至,我心向往之
- c语言链表中next作用,C语言链表中q-next=p;表示什么意思?
- 二十一世纪大学英语读写基础教程学习笔记(原文)——5 - Shipwrecked in Antarctica(沉船南极洲)
- wireshark编译基于openflow1.3协议开发