文件处理(一)

file文件操作_操作系统底层关系_写入文件

文件操作

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

有基础的同学知道,很多软件系统是将数据存储的数据库中;数据库实际也是基于文件形式存储的,本章我们就学习文件的相关操作。

文本文件和二进制文件

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

  1. 文本文件

    文本文件存储的是普通“字符”文本,python默认为unicode字符集(两个字节表示一个字符,最多可以表示:65536个),可以使用记事本程序打开。

  2. 二进制文件

二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有:MP4视频文件、MP3音频文件、JPG图片、doc文档等等。

文件操作相关模块概述

Python标准库中,如

下是文件操作相关的模块。 

名称说明
bz2、gzip、zipfile、zlib、tarfile用于处理压缩和解压缩文件(分别对应不同的算法)
csv模块用于csv文件处理
filecmp模块用于文件的比较
fileinput模块处理多个输入文件
fnmatch模块使用模式来匹配文件路径名
glob模块查找符合特定规则的文件路径名
io模块文件流的输入和输出操作 input output
os模块基本操作系统功能,包括文件操作
pickle和cPickle用于序列化和反序列化
xml包用于XML数据处理

创建文件对象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模式(可与其他模式组合使用)
+读、写模式(可与其他模式组合使用)

文本文件对象和二进制文件对象的创建:

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

文本文件的写入

基本的文件写入操作

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

  1. 创建文件对象
  2. 写入数据
  3. 关闭文件对象

我们首先创建一个小程序,体验一下文本文件的写入操作。

【操作】文本写入操作简单测试

f = open(r"a.txt","a")
s = "不温浊酒"
f.write(s)
f.close()

或者使用with上下文管理:

with open(r"b.txt","a") as f:s = "不温浊酒"f.write(s)

执行结果:

不温浊酒

编码知识_中文乱码问题解决

常用编码介绍

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

常用编码之间的关系如下:

ASCII

全称为American Standard Code for Information Interchange,美国信息交换标准代码,这是世界上最早最通用的单字节编码系统,主要用来显示现代英语及其他西欧语言。

ASCII码用7位表示,只能表示128个字符。只定义了27=128个字符,用7bit即可完全编码,而一字节8bit的容量是256,所以一字节ASCII的编码最高位总是0。

0~31表示控制字符如回车、退格、删除等;32~126表示打印字符即可以通过键盘输入并且能显示出来的字符; 其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等,具体可以参考ASCII标准表(大家自行百度,不在此赘述)。

ISO8859-1

ISO-8859-1又称Latin-1,是一个8位单字节字符集,它把ASCII的最高位也利用起来,并兼容了ASCII,新增的空间是128,但它并没有完全用完。

ASCII编码之上又增加了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号,它是向下兼容ASCII编码

GB2312,GBK,GB18030

GB2312

GB2312全称为信息交换用汉字编码字符集,是中国于1980年发布,主要用于计算机系统中的汉字处理。GB2312主要收录了6763个汉字、682个符号。

GB2312覆盖了汉字的大部分使用率,但不能处理像古汉语等特殊的罕用字,所以后来出现了像GBKGB18030这种编码。

GB2312完全兼容ISO8859-1

GBK

全称为Chinese Internal Code Specification,即汉字内码扩展规范,于1995年制定。它主要是扩展了GB2312,在它的基础上又加了更多的汉字,它一共收录了21003个汉字

GB18030

现在最新的内码字集于2000年发布,并于2001年强制执行,包含了中国大部分少数民族的语言字符,收录汉字数超过70000余个。

它主要采用单字节、双字节、四字节对字符编码,它是向下兼容GB2312GBK的,虽然是我国的强制使用标准,但在实际生产中很少用到,用得最多的反而是GBKGB2312

Unicode

Unicode编码设计成了固定两个字节,所有的字符都用16位(2^16=65536)表示,包括之前只占8位的英文字符等,所以会造成空间的浪费,UNICODE在很长的一段时间内都没有得到推广应用。

Unicode完全重新设计,不兼容iso8859-1,也不兼容任何其他编码。

UTF-8

对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了UTF编码UTF-8全称是(8-bit Unicode Transformation Format)。

UTF编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,UTF编码是不定长编码,每一个字符的长度从1-4个字节不等。其中,英文字母都是用一个字节表示,而汉字使用三个字节。一般项目都会使用UTF-8

中文乱码问题

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

【示例】中文字符文件,乱码出现测试

#测试写入中文
f = open(r"b.txt","w")
f.write("不温浊酒")
f.close()

运行结果(Linux环境中不存在这个问题):

我们在文件编辑区单击右键,选择FileEncoding,选择GBK即可:

再选择Reload,文件即显示正常。

#测试写入中文
f = open(r"b.txt","w",encoding="utf-8")
f.write("不温浊酒")
f.close()

运行结果:

write()/writelines()写入数据

write(a):把字符串a写入到文件中

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

【操作】添加字符串列表数据到文件中

f = open(r"d:\bb.txt","w",encoding="utf-8")
s = ["张三\n","李四\n","王五\n"]
f.writelines(s)
f.close()

运行结果:

关闭流要点1_finally异常管理

close()关闭文件流

由于文件底层是由操作系统控制,所以我们打开的文件对象必须显式调用close()方法关闭文件对象。当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法),再关闭文件,释放文件对象。

为了确保打开的文件对象正常关闭,一般结合异常机制的finally或者with关键字实现无论何种情况都能关闭打开的文件对象。

【操作】结合异常机制的finally,确保关闭文件对象

try:f = open(r"my01.txt","a")s = "不温浊酒"f.write(s)
except BaseException as e:print(e)
finally:f.close()

关闭流要点2_with上下文管理

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

【操作】使用with管理文件写入操作

s = ["张三\n","李四\n","王五\n"]
with open(r"d:\bb.txt","w") as f:f.writelines(s)

文本文件的读取

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

  1. read([size]) 从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件。 读取到文件末尾,会返回空字符串。

  2. readline()

    读取一行内容作为结果返回。读取到文件末尾,会返回空字符串

  3. readlines()

    文本文件中,每一行作为一个字符串存入列表中,返回该列表

【操作】 读取一个文件前4个字符

with open(r"a.txt","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:breakelse:print(fragment,end="")

【操作】使用迭代器(每次返回一行)读取文本文件

with open(r"d:\bb.txt","r") as f:for a in f:print(a,end="")

【操作】为文本文件每一行的末尾增加行号

with open("b.txt","r",encoding="utf-8") as f:lines = f.readlines()lines2 = [line.rstrip()+"  #"+str(index)+"\n" for index,line in zip(range(1,len(lines)+1),lines)]
with open("b.txt","w",encoding="utf-8") as f:f.writelines(lines2)

二进制文件的读写_图片文件的拷贝

二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建出二进制文件对象。例如:

f = open(r"d:\a.txt", 'wb') #可写的、重写模式的二进制文件对象

f = open(r"d:\a.txt", 'ab') #可写的、追加模式的二进制文件对象

f = open(r"d:\a.txt", 'rb') #可读的二进制文件对象

创建好二进制文件对象后,仍然可以使用write()read()实现文件的读写操作。

【操作】 读取图片文件,实现文件的拷贝

with open('logo1.png', 'rb')as srcFile,open("ddd.png","wb") as destFile:for line in srcFile:destFile.write(line)
​

文件对象常用方法和属性总结_seek()任意位置操作

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

文件对象封装了文件相关的操作。在前面我们学习了通过文件对象对文件进行读写操作。本节我们详细列出文件对象的常用属性和方法,并进行说明。

文件对象的属性

属性说明
name返回文件的名字
mode返回文件的打开模式
closed若文件被关闭, 则返回True

文件对象的打开模式

模式说明
r读模式
w写模式
a追加模式
b二进制模式(可与其他模式组合)
+读写模式(可以其他模式组合)

文件对象的常用方法

方法名说明
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()把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源

文件任意位置操作

【示例】seek()移动文件指针示例

#e.txt的内容是:abcefghljklmn
with open("e.txt","r",encoding="utf-8") as f:print("文件名是:{0}".format(f.name)) #文件名是:e.txtprint(f.tell())           #0print("读取的内容:{0}".format(str(f.readline()))) #读取的内容:abcdefghijklmnprint(f.tell())           #14f.seek(3,0)print("读取的内容:{0}".format(str(f.readline()))) #读取的内容:defghijklmn

使用pickle实现序列化和反序列化

使用pickle序列化

序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。

我们可以使用pickle模块中的函数,实现序列化和反序列操作。

Python中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。

序列化我们使用:

pickle.dump(obj, file) obj就是要被序列化的对象,file指的是存储的文件

pickle.load(file) 从file读取数据,反序列化成对象

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Linux使用C语言实现简单的目录管理

在Linux下&#xff0c;需要实现某个目录下文件的遍历的时候&#xff0c;可以使用opendir&#xff0c;readdir&#xff0c;closedir这些接口。这些接口使用说明如下所示&#xff1a; 1).opendir DIR* opendir(const char * name); #include <sys/types.h> #include …

Linux系统学习总结(上)

B站大学地址&#xff1a;第二章-04-ls命令的参数和选项_哔哩哔哩_bilibili 操作系统概述 1、计算机是由硬件和软件两部分组成的 2、操作系统是软件的一类&#xff0c;主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁 3、常见的操作系统分为两类…

车企都卷入鸿蒙开发的行了!难怪岗位需求量涨这么快!!!

近日华为鸿蒙 OS 官微宣布&#xff0c;首批汽车行业伙伴广汽传祺、岚图汽车、零跑汽车、凯翼汽车官宣加入鸿蒙生态。 这四家车企加入&#xff0c;会不会影响着其他车企想哪些手机APP厂商那种陆续的跟上呢&#xff1f; 其实在此前国内新能源扛把子比亚迪早已与华为达成了合作&a…

18个惊艳的可视化大屏(第26辑):航空与运输业

hello&#xff0c;我是贝格前端工场老司机&#xff0c;这是第26期了&#xff0c;本次带来可视化大屏在航空与运输业的应用案例&#xff0c;喜欢文章的别忘点赞关注&#xff0c;文章底部也有其他行业的案例。 可视化大屏在航空与运输业中具有以下九大价值&#xff1a; 实时监控…

IT系统可观测性

什么是可观测性 可观测性&#xff08;Observability&#xff09;是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域&#xff0c;它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

心灵治愈交流平台|基于springboot框架+ Mysql+Java+B/S结构的心灵治愈交流平台设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 心理咨询师功能 系统功能设计 数据库…

蓝桥杯前端Web赛道-输入搜索联想

蓝桥杯前端Web赛道-输入搜索联想 题目链接&#xff1a;1.输入搜索联想 - 蓝桥云课 (lanqiao.cn) 题目要求&#xff1a; 题目中还包含effect.gif 更详细的说明了需求 那么观察这道题需要做两件事情 把表头的每一个字母进行大写进行模糊查询 这里我们会用到几个js函数&#…

洛谷 P1378 油滴扩展

本道题可以理解成一个平面直角坐标系&#xff0c;在坐标系上标出整个矩形和油滴的坐标&#xff0c;计算两个油滴的面积和直径&#xff0c;判断点是否在圆内&#xff08;点与圆的位置关系&#xff09;&#xff0c;利用使用坐标求两点间距离的公式取解。 代码如下&#xff1a; …

面试 Java 并发编程八股文十问十答第十期

面试 Java 并发编程八股文十问十答第十期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;Executors和ThreaP…

Java Web项目—餐饮管理系统Day09-用户端开发(二)

文章目录 1. 地址簿管理1-1. 新增地址1-2 查询当前用户的地址簿1-3. 更新默认地址1-4. 获取默认地址1-5. 修改地址 2. 订单管理2-1. 表结构2-2 提交订单 本章节主要完成地址簿的管理以及订单管理, 同时完善系统的部分细节, Reggie TakeAway 系统篇章基础篇告一段落. 1. 地址簿管…

重要JVM参数和监控指令、工具

一、重要JVM参数 堆内存相关 1.显式指定堆内存–Xms和-Xmx -Xms<heap size>[unit] -Xmx<heap size>[unit] //如果我们要为 JVM 分配最小 2 GB 和最大 5 GB 的堆内存大小 -Xms2G -Xmx5G2.显式新生代内存(Young Generation) -XX:NewSize<young size>[unit]…

SpringBoot异常:类文件具有错误的版本 61.0, 应为 52.0的解决办法

问题&#xff1a; java: 无法访问org.mybatis.spring.annotation.MapperScan 错误的类文件: /D:/Program Files/apache-maven-3.6.0/repository/org/mybatis/mybatis-spring/3.0.3/mybatis-spring-3.0.3.jar!/org/mybatis/spring/annotation/MapperScan.class 类文件具有错误的…

实体门店加盟全解析:如何选择加盟项目与避免风险

对于想要开实体店或创业的人来说&#xff0c;拥有一个全面的运营方案是成功的关键。作为一名开鲜奶吧5年的创业者&#xff0c;我将为大家详细分享从选址到日常管理的实体店运营要点&#xff0c;帮助创业者少走弯路。 一、选择加盟项目 1.行业前景&#xff1a;选择一个有发展前…

Flutter第五弹:Flutter布局

目标&#xff1a; 1&#xff09;Flutter常用的布局容器小组件有哪些&#xff1f; 2&#xff09;Flutter列表组件的小例子。 一、Flutter常用的容器组件 1.1 Container组件 Container 部件有许多可用的属性&#xff0c;以下是一些常用的属性&#xff1a; 属性说明alignmen…

【华为OD机试】小明找位置【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 小朋友出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。 算法复杂度要求不高于 nLog(n);学号为整数类型,队列规模<=10000; 输入描述 1…

java15~17 密封类

密封类是java15第一次预览&#xff0c;java17正式确定。Java15的密封类是一种确定了子类的类。这个改变是巨大的&#xff0c;以往的Java版本根本无法确定到底有哪些子类。而在java15中&#xff0c;如果定义了一个类为密封类就可以确定有哪些直接子类了。如下面的例子&#xff1…

Vue2(五):收集表单数据、过滤器、自定义指令、Vue的生命周期

一、收集表单数据 爱好&#xff1a;学习<input type"checkbox" value"study" v-model"hobby">打游戏<input type"checkbox" value"games" v-model"hobby">吃饭<input type"checkbox" v…

独立维基和验收测试框架 Fitnesse 入门介绍

拓展阅读 junit5 系列教程 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。压测测试报告生成。) Fitnesse 完全集成的独立维基和验收测试…

大数据开发--01.初步认识了解

一.环境准备 1.使用虚拟机构建至少三台linux服务器 2.使用公有云来部署服务器 二.大数据相关概念 大数据是指处理和分析大规模数据集的一系列技术、工具和方法。这些数据集通常涉及海量的数据&#xff0c;包括结构化数据&#xff08;如关系型数据库中的表格&#xff09;以及…

美联社报道波场与亚马逊云计算重磅合作 称符合其去中心化使命

近日,波场TRON宣布已集成亚马逊云计算服务(AWS),引发美联社、金融时报、费加罗报等多家海外主流媒体高度关注。报道表示,此次集成旨在利用AWS 强大的云计算资源,降低用户和开发者参与波场网络的准入门槛,打造更加去中心化、更强大的区块链生态系统。 报道内容显示,通过此次合作…