Python知识回顾(10)

Day 10
本节主要讲解的是Python中文件操作(IO 技术)方面的知识。

文章目录

    • 1.文件的处理
      • 1.1.1 文本文件和二进制文件
      • 1.1.2 文件操作相关模块概述
      • 1.3 创建文件对象 open()
      • 1.4 文本文件的写入
      • 1.5 常用编码介绍
        • 1.5.1 中文乱码问题
        • 1.5.2 write()/writelines()写入数据
        • 1.5.3 close()关闭文件流与with 语句(上下文管理器)
      • 1.6 文本文件的读取
      • 1.7 二进制文件的读取和写入
      • 1.8 文件对象的常用属性和方法
      • 1.9 使用 pickle 序列化
      • 1.10 CSV 文件的操作
      • 1.11 os 和 os.path 模块

一个完整的程序一般都包括数据的存储和读取;我们在前面写的程序数据都没有进行实际的存储,因此 python 解释器执行完数据就消失了。实际开发中,我们经常需要从外部存储介质(硬盘、光盘、U 盘等)读取数据,或者将程序产生的数据存储到文件中,实现“持久化”保存。

1.文件的处理

1.1.1 文本文件和二进制文件

按文件中数据组织形式,我们把文件分为文本文件和二进制文件两大类。

  1. 文本文件
    文本文件存储的是普通“字符”文本,python 默认为 unicode 字符集(两个字节表示一个字符,最多可以表示:65536 个),可以使用记事本程序打开。但是,像 word 软件编辑的文档不是文本文件。
  2. 二进制文件
    二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4 视频文件、MP3 音频文件、JPG 图片、doc 文档等等。

1.1.2 文件操作相关模块概述

Python 标准库中,如下是文件操作相关的模块,我们会陆续给大家介绍。
名称 说明
io 模块 文件流的输入和输出操作 input
os 模块 基本操作系统功能,包括文件操作
glob 模块 查找符合特定规则的文件路径名
fnmatch 模块 使用模式来匹配文件路径名
fileinput 模块 处理多个输入文件
filecmp 模块 用于文件的比较
cvs 模块 用于 csv 文件处理
pickle 和 cPickle 用于序列化和反序列化
xml 包 用于 XML 数据处理
bz2、gzip、zipfile、zlib、tarfile 用于处理压缩和解压缩文件(分别对应不同的算法)

1.3 创建文件对象 open()

open()函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路径,比如:D:\a\b.txt。
为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。示例如下:
f = open(r"d:\b.txt",“w”)
打开方式有如下几种:

模式对应的功能
r读 read 模式
w写 write 模式。如果文件不存在则创建;如果文件存在,则重写新内容;
a追加 append 模式。如果文件不存在则创建;如果文件存在,则在文件末尾追加内容
b二进制 binary 模式(可与其他模式组合使用)
+读、写模式(可与其他模式组合使用)

文本文件对象和二进制文件对象的创建:
如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。

1.4 文本文件的写入

文本文件的写入一般就是三个步骤:

  1. 创建文件对象
  2. 写入数据
  3. 关闭文件对象
f = open(r"a.txt","a")
s = "kaikai\n666\n"
f.write(s)
f.close()

1.5 常用编码介绍

在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种编码之间的关系。
在这里插入图片描述

1.5.1 中文乱码问题

windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。当我们用 open()时,调用的是操作系统打开的文件,默认的编码是GBK。

#测试中文写入
f = open(r"b.txt","w")
f.write("谭松韵天下第一美\n谭松韵是楷楷的偶像\n")
f,close()

运行结果(Linux 环境中不存在这个问题):
在这里插入图片描述我们在文件编辑区单击右键,选择FileEncoding,选择 GBK 即可:
在这里插入图片描述再选择 Reload,文件即显示正常。
在这里插入图片描述我们也可以通过下面的方法进行解决

f = open(r"b.txt","w",encoding = "utf-8")
f.write("谭松韵天下第一美\n谭松韵是楷楷的偶像\n")
f.close()

1.5.2 write()/writelines()写入数据

write(a):把字符串 a 写入到文件中。
writelines(b):把字符串列表写入文件中,不添加换行符。

#添加字符串列表数据到文件中
f = open(r"b.txt","w",encoding = "utf-8")
s = ["谭松韵\n","耿耿\n","袁今夏\n"]
f.writelines(s)
f.close()

1.5.3 close()关闭文件流与with 语句(上下文管理器)

由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用 close()方法关闭文件对象。当调用 close()方法时,首先会把缓冲区数据写入文件(也可以直接调用 flush()方法),再关闭文件,释放文件对象。
为了确保打开的文件对象正常关闭,一般结合异常机制的 finally 或者 with 关键字实现,无论何种情况都能关闭打开的文件对象。

try:f = open(r"b.txt","a")str = "kaikia"f.write(str)
except BaseException as e:print(e)
finally:
f.close()

with 关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出 with 块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场。

s = ["谭松韵\n","耿耿\n","袁今夏\n"]
with open(r"d:\bb.txt","w") as f:
f.writelines(s)

1.6 文本文件的读取

文件的读取一般使用如下三个方法:

  1. read([size])
    从文件中读取 size 个字符,并作为结果返回。如果没有 size 参数,则读取整个文件。读取到文件末尾,会返回空字符串。
  2. readline()
    读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
  3. readlines()
    文本文件中,每一行作为一个字符串存入列表中,返回该列表。
with open(r"bb","r",encoding="utf-8") as f:print(f.read(4))
######下面这种方法是全部读入,而不是只读前四个字符######
with open(r"d:\bb.txt","r") as f:print(f.read())

示例:按行读取一个文件

with open(r"bb.txt","r") as f:while True:fragment = f.readline()if not fragment:breakelseprint(fragment,end"")

示例:为文本文件每一行的末尾增加行号

with open(r"d:\bb.txt","r") as f:print(f.read())

示例:为文本文件每一行的末尾增加行号

with open("e.txt","r",encoding="utf-8") as f:lines = f.readlines()lines = [ line.rstrip()+" #"+str(index+1)+"\n" for index,line in enumerate(lines)]
#推导式生成列表
with open("e.txt","w",encoding="utf-8") as f:f.writelines(lines)

1.7 二进制文件的读取和写入

二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如:
f = open(r"d:\a.txt", ‘wb’) #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", ‘ab’) #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", ‘rb’) #可读的二进制文件对象

with open('aa.gif', 'rb') as f:with open('aa_copy.gif', 'wb') as w:for line in f.readlines():w.write(line)
print('图片拷贝完成!')

1.8 文件对象的常用属性和方法

name 返回文件的名字
mode 返回文件的打开模式
closed 若文件被关闭则返回 True
方法名 说明
read([size]) 从文件中读取 size 个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline() 从文本文件中读取一行内容
readlines() 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str) 将字符串 str 内容写入文件
writelines(s) 将字符串列表 s 写入文件文件,不添加换行符
seek(offset[,whence]) 把文件指针移动到新的位置,offset 表示相对于 whence 的多少个字节的偏移量;
offset:
off 为正往结束方向移动,为负往开始方向移动
whence 不同的值代表不同含义:
0: 从文件头开始计算(默认值)
1:从当前位置开始计算
2:从文件尾开始计算
tell() 返回文件指针的当前位置
truncate([size]) 不论指针在什么位置,只留下指针前 size 个字节的内容,其余全部删除;
如果没有传入 size,则当指针当前位置到文件末尾内容全部删除
flush() 把缓冲区的内容写入文件,但不关闭文件
close() 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源

1.9 使用 pickle 序列化

Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。
序列化我们使用:
pickle.dump(obj, file),obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file),从 file 读取数据,反序列化成对象

#将对象序列化到文件中
import pickle
with open(r"d:\data.dat","wb") as f:a1 = "谭松韵"a2 = 234a3 = [20,30,40]pickle.dump(a1,f)pickle.dump(a2, f)pickle.dump(a3, f)
#将获得的数据反序列化成对象
with open(r"d:\data.dat","rb") as f:a1 = pickle.load(f)a2 = pickle.load(f)a3 = pickle.load(f)print(a1)print(a2)print(a3)

1.10 CSV 文件的操作

csv (Comma Separated Values) 是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库数据的导入和导出。 与 Excel 文件不同,CSV 文件中:
值没有类型,所有值都是字符串
不能指定字体颜色等样式
不能指定单元格的宽高,不能合并单元格
没有多个工作表
不能嵌入图像图表
Python 标准库的模块 csv 提供了读取和写入 csv 格式文件的对象。
我们在 excel 中建立一个简单的表格:
在这里插入图片描述另存为"csv(逗号分隔)",我们打开查看这个 csv 文件内容:
姓名,年龄,工作,薪水
高淇,18,程序员,50000
高老三,19,测试工程师,20000
高老五,20,人工智能开发,50000

1.11 os 和 os.path 模块

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

import os
os.system("notepad.exe")
os.system("ping www.baidu.com")

注:Linux 是命令行操作更容易,我们可以通过 os.system 可以更加容易的调用相关的命令;
注:控制台输出中文可能会有乱码问题,可以在 file–>setting 中设置:
在这里插入图片描述os 模块-文件和目录操作

方法名描述
remove(path)删除指定的文件
rename(src,dest)重命名文件或目录
stat(path)返回文件的所有属性
listdir(path)返回 path 目录下的文件和目录列表
mkdir(path)创建目录
makedirs(path1/path2/path3/…)创建多级目录
getcwd()返回当前工作目录:current work dir
chdir(path)把 path 设为当前工作目录
walk()遍历目录树
sep当前操作系统所使用的路径分隔符

使用格式如下:

#coding=utf-8
#测试 os 模块中,关于文件和目录的操作
import os
#############获取文件和文件夹相关的信息################
print(os.name)
print(os.sep)
print(repr(os.linesep))

os.path 模块
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)从路径中分割文件的扩展名

使用格式如下:

#测试 os.path 常用方法
import os
import os.path
#################获得目录、文件基本信息
######################
print(os.path.isabs("d:/a.txt"))
print(os.path.isdir("d:/a.txt"))
print(os.path.isfile("d:/a.txt"))
print(os.path.exists("a.txt"))
#是否绝对路径
#是否目录
#是否文件
#文件是否存在

os.walk()方法:
返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
示例:使用 walk()递归遍历所有文件和目录

import os
all_files = []
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files: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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/250835.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

安卓手机阅读器_得到电纸书阅读器到底如何,值不值得买?使用一个月后,我告诉你答案!...

1 电纸书墨水屏的发展 一直以来,这世界上只有两种电纸书阅读器(电子书阅读器),一种是Kindle,另一种是其他。当然索尼的电子纸也不错,不过它的定位和价格已经不是普通的看电子书了。 自2007年第一代Kindle问世,如今已经将近13年过去了。Kindle有了更高的知名度,也有了更…

HNU-电子测试平台与工具2-串口实验5次

计算机串口使用与测量 【实验属于电子测试平台与工具】 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 0.环境搭建 在实验开始之前,安装好Ubuntu 20.04操作系统。(这个没有难度) 但要提醒的是,这个ubuntu是xubuntu,而且虚拟硬盘只有10GB的大小…

Java开发 - 让你少走弯路的Redis的主从复制

前言 大家举举手,让我看看还有多少人不会配置Redis的主从,主主这些的。故事发生在前段时间,小伙伴看到了博主的MySQL主从,就问博主有没有Redis的主从配置教程,本以为网上到处都是教程的博主打开网页一搜,好…

程序员の诗 - 启蒙

启蒙 一入挨踢(IT)门,从此断红尘。 网络席卷人生路,代码看似少年梦。 面朝电脑黑眼圈,一坐又是一整天。 错把代码当成梦,写尽半生皆是空。 然, 机器识 0 1,吾辈创世界&#xf…

linux恶搞指令

alias 指令 linux命令提供了一个有用的工具alias,让我们将需要频繁使用但又过于冗长的命令设置一个别名,以后只需要输入一个简单的别名就可以达到同样的作用 alias 查看当前设置的所有别名 alias cdtest‘cd /src/www/app/account’ 等号两边不能有空格 unalias c…

我爱优雅的代码,我爱搞笑的诗词

天王盖地府,小鸡炖蘑菇,拿了此大奖,才是最幸福。 也不知道什么原因,平时总爱写写各种好玩的东西,作为程序员,也许是一个放松的方式吧,我不喜欢做一个只会写代码的码农,我喜欢能在各个…

用计算机术语写诗,网上盛行写诗软件 电脑作诗毫无逻辑令人喷饭

自从“诗坛芙蓉”赵丽华(BLOG)红遍网络之后,诗歌——一个几乎被忽略的文学体裁又重新引起了大家的关注。 昨日(27日),记者在浏览网站时发现,目前网络上一款写诗软件十分盛行, 只要输入几个关键字,电脑就自动写出一首诗…

机器学习知识经验分享之五:R语言安装

python语言用于深度学习较为广泛,R语言用于机器学习领域中的数据预测和数据处理算法较多,后续将更多分享机器学习数据预测相关知识的分享,有需要的朋友可持续关注,有疑问可以关注后私信留言。 目录 一、R语言介绍 二、R语言安装…

上海斯歌K2 x 赛博威 | 战略合作深度交流暨签约仪式

2月16日,上海斯歌K2与赛博威进行了战略合作深度交流,并在赛博威广州科学城办公室举办战略合作签约仪式。 为满足客户在数智化建设过程中的多元化需求,上海斯歌K2与赛博威曾多次产生交集。凭借双方多年合作的良好基础,自2022年始&a…

Eclipse教程 Ⅸ

今天继续来学习Eclipse 快速修复、Eclipse 浏览菜单、Eclipse 查找以及Eclipse 悬浮提示的内容!老规矩,废话不多说,开始吧。 Eclipse 快速修复 使用快速修复 在 Eclipse 编辑器中当你输入字母时,编辑器会对你输入的内容进行错误…

matplotlib常用功能汇总

文章目录 1.IDE里的1.1 显示模式(plt.ion()和plt.ioff())1.2 backend说明 2 jupyter里的3 通用的3.1 cmap3.2 subplot()相关3.3 绘制动态图(Animation类)3.4 matplotlib利用rcParams配置样式参数 4. 与opencv连用可能遭遇的问题1.…

再谈Linux epoll惊群问题的原因和解决方案

差别是什么?差别只是西装! 缘起 近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡。一共fork了20个Server进程,在请求负载中等的时候&…

自适应网格搜索的多目标粒子群优化(MOPSO)

此博客中对文档的翻译为博主自己学习时意译的,仅用于学习用途,如有侵权请联系博主删除。如果有不足的地方,欢迎大家评论指出,与博主共同学习。 MOPSO对多目标粒子群优化的一个小建议 这篇文章提出了一个建议是扩展粒子群优化的启…

Python 极简socket多人聊天群

前言 别看目录又臭又长,其实可以直接从 第二章 开始看,因为 第一章 主要讲述socket的基础概念。但如果你只是想参考一下,可以直接跳到最后一章。 整个项目只使用了python的标准库,并建议初学者看完第一章 注:写这篇教程…

微信群机器人微云助手微小云如何设置群内积分兑换

经常有用户咨询我们询问积分有什么用,小编沉思之后只能说,没什么卵用…… 不过现在不一样了,微小云在新版本中推出了积分商城,积分商城可以让群友使用群内产生的积分兑换礼品了 具体怎么使用呢 首先点击登录的机器人,然后就可以看到积分商城的设置部分了 积分商城一共有4个功…

【继承】【群主发红包案例】

一、题目要求: 群主发普通红包。某群有多名成员,群主给成员发普通红包。普通红包的规则: ①.群主的- -笔金额, 从群主余额中扣除,平均分成n等份,让成员领取。 ②.成员领取红包后,保存到成员余额中。 请…

如何区分企业微信的内部群和外部群

企微内部群主要分成3种:全员群、部门群、内部群 1,全员群:上限10000人,群名会有【全员】标记 企业全员群,新入职的员工将自动加入此群,离职后将自动退群。加入的同事可以看到历史的群聊消息。全员群人数上限…

QQ群主怎么清理群里的不良内容(怎么一次性全部删除QQ群不良信息)

今天突然发现加我们的QQ群的人数减少了,打开群属性看到了如下信息,该群在群搜索结果中的排名将不予展示,群内一下内容模块存在较多不良内容,清理并通过审核可解除搜索屏蔽并提升星级。显示是4星,最优是5星!…

前端gojs中禁用指定节点的选中效果

代码思路 适用于禁用某些节点的选中状态,选中节点时判断该节点要不要禁用 点击节点的时候,判断节点要不要禁用选中效果 如果禁用,就在选中时,把选中节点重置为最近一次非禁用的节点 diagram.select:选中节点 diagram.…

HTML+CSS实现前端网页界面案例

众所周知,HTML、CSS、JS是前端的三大件。那么,就仅仅HTML和CSS两件就可以完成大部分简单的页面的制作。就此,向大家分享一个普通的百度新闻网页,并完成设计。 在这里,可以点击鼠标右键---->检查,或者快捷…