python学习之【文件读写】

2023-09-20 23:18:06

前言

上一篇文章​ ​ python学习——【第十四弹】 ​​​中学习了python中的包与内置模块,这篇文章接着学习python中的文件读写。

编码方式

在学习文件读写之前,我们先了解下python当中的编码方式:
在这里插入图片描述

字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。
字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。
一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。


ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。

python的解释器使用的Unicode(内存),python文件(.py)在磁盘上使用的是UTF-8(外存)。

python3中默认使用的是UTF-8的编码;

我们可以使用sys模块中的getdefaultencoding()获取默认的编码格式

import sys
print(sys.getdefaultencoding())
# utf-8

在计算机内存中,统一使用的是Unicode编码,当需要保存在硬盘或者是需要传输的时候,就会转换为UTF-8编码:

当我们用记事本进行编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里;编辑完成后进行保存,会再将Unicode转换为UTF-8保存到文件中。

在这里插入图片描述
我们看用python文件用记事本打开,然后另存时默认的编码类型:

在这里插入图片描述
而记事本的保存的默认编码格式是ANSI,(准确说,并不存在哪种具体的编码方式叫做ANSI,它只是一个Windows操作系统上的别称而已。在中文简体Windows操作系统上,ANSI就是GBK),如果我们直接用python去新建一个txt文本文档的文件,由于编码格式的不兼容,因此会发生乱码:

在这里插入图片描述
在这里插入图片描述
为了避免编码格式不兼容的问题,我们可以在代码中进行修改写入数据的编码格式为UTF-8:

f = open("编码.txt", "w",encoding='UTF-8')#将输入数据的编码格式改为UTF-8
f.write("你好!世界!")
f.close()

在这里插入图片描述
想要对编码格式多加了解的伙伴,可以参考这篇文章:​ ​点击查看​​​。​

常见的文件打开模式

按照文件数据的组织形式,文件分为以下两个大类:

 文本文件:存储的是普通“字符”文本,默认为Unicode字符集,可以使用记事本程序打开

   二进制文件: 把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,如图片文件(.png  .jpeg等)以及  .doc文档等。 常见的打开模式:

  r  以只读的模式打开文件,文件的指针将会放在文件的开头

  w   以只写的模式打开文件  如果文件不存在就创建,如果文件存在就覆盖文件的原有内容,文件指针在文件的开头

  a   以追加的模式打开文件,如果文件不存在就创建,文件指针在文件开头;如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾

  b 以二进制的方式打开文件  不能单独使用,需要与共它模式一起使用 如 rb(只读的方式打开二进制文件)或者wb(只写的方式打开二进制文件)

  + 以读写的方式打开文件,不能单独使用,需要和其他模式一起使用 比如 a+

需要注意的是:我们在进行对文件的读写操作时,代码最后要对文件进行close()关闭操作:close()操作把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源。
r 只读

以只读的模式打开该文件

file_r=open('a.txt','r')
print(file_r.read())#读取文件内容
file_r.close() #关闭文件 只要我们打开了文件,在代码结束时就要写上关闭文件的代码,以释放资源。

说到只读,这里有文件对象的几种常用方法,我们可以用只读的方式来查看各个方法的功能:

read([size]) 从文件中读取size个字节或者是字符的内容的返回,如果省略[size]的话,就会从文件的开头一次性读取到文件的末尾;

readline()  从文本文件中读取第一行内容;

readlines()  把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表中返回;

seek(offest,[whence])  把文件指针移动到新的位置,offset表示相对于whence的位置;

tell()    返回文件指针的当前位置;

flush()  把缓冲区的内容写入到文件中,但是不关闭文件​

我们先读取a.py中的全部内容:

在这里插入图片描述
然后用读取文件对象的常用方法读取a.txt :

# read([size])   从文件中读取size个字节或者是字符的内容的返回,如果省略[size]的话,就会从文件的开头一次性读取到文件的末尾
file_r=open('a.txt','r')
print(file_r.read(5)) #返回5个字节
file_r.close()

print('------------------------\n')

# readline()  读取文本中的第一行内容
file_rl=open('a.txt')
print(file_rl.readline())
file_rl.close()

print('------------------------\n')

# readlines()   把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表中返回
file_rls=open('a.txt','r')
print(file_rls.readlines())
file_rls.close()

在这里插入图片描述

seek()

seek()的括号中输入字节数,文件的指针就会从文件开头往后移动几个字节

file_seek=open('a.txt','r')
file_seek.seek(2)
print((file_seek.read()))
file_seek.close()  #llo world

a.txt:
在这里插入图片描述
需要注意:如果我们需要读取的字节数必须是正确的字节数;比如在读取汉字时,如果是输入2,而UTF-8的编码中一个汉字是3个字节,会导致程序报错。

tell()

返回文件指针的当前位置

file=open('a.txt','r')
file.seek(2)
print(file.read())
print(file.tell()) #返回指针当前所在的位置
file.close()

在这里插入图片描述

flush()

把缓冲区的内容写入到文件中,但是不关闭文件

file=open('b.txt','a')#采用追加的方式打开文件
file.write('hello')
file.flush()  #把缓冲区的内容写入到文件中,但是不关闭文件
file.write('world')
file.close()

但是我们将flush()和close()区分开来,flush()不会关闭该文件,也就是说可以在flush()代码执行之后可以继续往文件里写入数据;但是close()执行后就不能再往文件中写入数据了,否则会报错。

在这里插入图片描述

w 只写

以只写的模式打开文件 ,如果文件不存在就创建,如果文件存在就覆盖文件的原有内容,文件指针在文件的开头:
在这里插入图片描述
在这里插入图片描述
只读的模式打开a.txt,我们发现a.txt文件中的原有内容被覆盖。

这里我们用到了文件对象的写入方法 : write(str) 将字符串str内容写入文件

还有一种常用的文件对象的写入方法:

writelines(s_list) 将字符串列表s_list写入文本文件,并且不添加换行符

s_lis1=['hello','world','hello','python']
file_wl=open('a.txt','w')
file_wl.writelines(s_lis1)
file_wl.close()

在这里插入图片描述
使用该方法需要注意的是写入的必须是字符串列表,如果不是字符串列表会报类型错误:
在这里插入图片描述

a 以追加的模式打开文件

以追加的模式打开文件,如果文件不存在就创建,文件指针在文件开头;如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾。

file_a=open('a.txt',"a")
file_a.write('python') #写入'python'
file_a.close()

在这里插入图片描述
在这里插入图片描述

b 打开二进制的文件

二进制文件: 把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,如图片文件(.png .jpeg等)以及 .doc文档等。

b 不能单独使用,需要与共它模式一起使用: 如rb或者wb

# 打开读取源文件
src_file=open('befor.png','rb')
# 打开写入目标文件
target_file=open('after.png','wb')
# 将从源文件中读取的文件写入目标文件
target_file.write(src_file.read())
# 将目标文件和源文件关闭
target_file.close()
src_file.close()

在这里插入图片描述

每篇一语

不要在夕阳西下时幻想,要在旭日东升时努力。

如有不足,感谢指正!

更多推荐

Spring Cloud Gateway快速入门(一)——网关简介

文章目录前言一、什么是网关1.1gateway的特点1.2为什么要使用gateway二、使用Nginx实现网关服务什么是网关服务?为什么选择Nginx作为网关服务?如何使用Nginx实现网关服务?1.安装Nginx2.配置Nginx3.启动Nginx4.测试网关服务总结代码编写三、使用Gateway实现网关服务什么是网

【Java 基础篇】Java后台线程和守护线程详解

在Java多线程编程中,有两种特殊类型的线程:后台线程(DaemonThread)和守护线程(DaemonThread)。这两种线程在一些特定的场景下非常有用,但也需要谨慎使用。本文将详细介绍后台线程和守护线程的概念、特性、用法,以及注意事项。什么是后台线程和守护线程?后台线程(DaemonThread)后台线程是一种

数组和指针笔试题解析之【指针】

目录🍂笔试题1:🍂笔试题2:🍂笔试题3:🍂笔试题4:🍂笔试题5:🍂笔试题6:🍂笔试题7:🍂笔试题8:🍂笔试题1:intmain(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));return0;}运行结

CTF 全讲解:[SWPUCTF 2022 新生赛]webdog1__start

文章目录参考环境题目learning.php信息收集isset()GET请求查询字符串全局变量$_GETMD5绕过MD5韧性脆弱性md5()弱比较隐式类型转换字符串连接数学运算布尔判断相等运算符MD5绕过科学计数法前缀0E与0e绕过start.php信息收集头部检索f14g.php信息收集探秘F1l1l1l1l1lag

【NLP入门教程】二十三、循环神经网络(RNN)| 小白专场

本教程旨在为初学者提供一份全面而系统的NLP入门指南,探索NLP的核心概念、方法和技术。无论你是计算机科学的新手,还是对自然语言处理领域感兴趣的研究人员,本教程都将为你提供所需的基础知识和实用技能。专栏地址:📕【NLP入门教程】当谈到自然语言处理(NLP)时,深度学习已经成为一种强大而广泛应用的技术。深度学习是一种机

Redis从入门到精通(二:数据类型)

数据存储类型介绍Redis数据类型(5种常用)stringhashlistsetsorted_set/zset(应用性较低)redis数据存储格式redis自身是一个Map,其中所有的数据都是采用key:value的形式存储数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串string

汇编基础(2) -- ARM64

简介ARM架构中,ARM64(也称为AArch64)是一种64位处理器架构,它是ARMv8指令集的一部分。与之前的32位ARM架构相比,ARM64提供了更大的寄存器容量、更广阔的地址空间和更高的计算能力。64位版本的指令集和32位版本的指令集有一些区别,这些区别主要涉及到以下几个方面:寄存器:ARM64架构提供了31个

[ 云计算 | AWS ] IAM 详解以及如何在 AWS 中直接创建 IAM 账号

本章节主要介绍IAM相关知识点以及在AWS控制台窗口如何创建一台AmazonIAM账号。文章目录一、什么是IAM?二、IAM常见种类2.1EIAM2.2CIAM2.3云厂商IAM三、账号(Account)三户模型四、认证(Authentication)4.1认证场景4.2认证方式4.3认证协议4.4认证源五、授权(Au

自然语言处理之北大词性标注集

最近在做人工智能相关技术的学习,在自然语言处理这里发现了词标注标准,顺带分享给小伙伴们词性是词汇基本的语法属性,通常也称为词类。词性标准是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程。例如名词、动词、形容词等。中文领域尚无统一的标注标准,较为主流的为北大的词性标注集和宾州词性标注集两大类。下面分享北大的

Python爬虫(二十一)_Selenium与PhantomJS

本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据,更多内容请参考:Python学习指南SeleniumSelenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可

MongoDB【部署 02】mongodb使用配置文件启动、添加为系统服务及自启动(一个报错:[13436][NotMasterOrSecondary])

MongoDB使用配置文件启动、添加为系统服务及设置自启动1.是什么2.下载安装启动配置2.1下载2.2安装2.3配置2.4使用配置文件启动3.设置系统服务及自启动3.1设置为系统服务3.2自启动1.是什么【以下内容来自ChatGPT3.5】MongoDB是一个流行的开源文档型数据库管理系统,广泛用于构建高度可扩展、灵

热文推荐