Python学习系列之编码格式(三十四)
编码格式
一、内容目录
1.编码格式的介绍
2.文件读写原理
3.文件读写操作
4.文件对象常用的方法
5.with语句
6.目录操作
二、编码格式的介绍
1.常见的字符编码格式
Python的解释器使用的是Unicode(内存)
.py文件在磁盘上使用UTF-8存储(外存)
Python中默认使用UTF-8编码,如果要使用其它编码方式,则需要手动加入代码
1 | #encoding=gbk |
在代码文件的第一行加入#encoding=gbk
三、文件读写原理
1.文件的读写俗称“IO操作”
2.文件读写操作流程
3. 读写操作原理
说明:.py文件经过解释器解释后,调用操作系统对硬盘文件进行读写操作
4.内置函数open()创建文件对象
说明:读入和写出都是相对内存而言的,读就表示内存从磁盘上读取文件内容到内存中,写就是从内存中把内容写入磁盘中保存
5.语法规则
语法格式:file = open( filename[,mode,encoding])
其中file是被创建的文件对象,open是创建文件对象的方法,filename是要创建或打开的文件名称,mode为打开文件的模式,默认是只读,encoding是打开文件的编码方式,默认文本中字符的编写格式为gbk
文件读写代码举例:
1 2 3 | file = open ( 'a2.txt' , 'r' ,encoding = 'utf-8' ) print ( file .readlines()) file .close() |
执行结果:
说明:readlines的结果是一个列表,会将文件的内容全部读取出来
四、常用的文件读取模式
文件的类型
按文件中数据的组织形式,文件分为以下两大类
文本文件:存储的是普通“字符”文本,默认为unicode字符集,可以使用记事本程序打开
二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:MP3音频文件,jpg图片,.doc文档等
代码举例:
例1:以只读方式读取文件并打印内容(a2.txt文件和.py文件在同一个目录下)
1 2 3 | file = open ( 'a2.txt' , 'r' ,encoding = 'utf-8' ) print ( file .readlines()) file .close() |
执行结果:
例2:以只写模式打开文件,当文件不存在时新建文件,文件存在时则覆盖原内容
- 当文件不存在时新建文件
1 2 3 | file = open ( 'b.txt' , 'w' ,encoding = 'utf-8' ) file .write( 'hello world' ) file .close() |
执行结果:生成了b.txt,并且将 hello world 写入到了b.txt中
- 文件存在时则覆盖原内容
1 2 3 | file = open ( 'b.txt' , 'w' ,encoding = 'utf-8' ) file .write( 'Python' ) #用 Python 替换原文件中的 hello world file .close() |
执行结果:
例3:将目录下的test.png复制一份,并重命名为copypng.png
1 2 3 4 5 6 7 8 9 | src_file = open ( 'test.png' , 'rb' ) target_file = open ( 'copypng.png' , 'wb' ) target_file.write(src_file.read()) target_file.close() src_file.close() |
执行结果:在目录下生成了copypng.png图片
例4:追加模式打开文件
- 如果文件不存在则创建,文件指针在文件开头
- 如果文件存在,则在文件末尾追加内容
五、文件对象的常用方法
代码举例:
例1:读取文件的全部内容
1 2 | file = open ( 'a2.txt' , 'r' ,encoding = 'utf-8' ) print ( file .read()) |
执行结果:将a2.txt文件中的所有内容读取了出来
例2:从文件中读取2个字节的内容并返回
1 2 | file = open ( 'a2.txt' , 'r' ,encoding = 'utf-8' ) print ( file .read( 2 )) |
执行结果:
例3:从文件中读取一行数据
1 2 | file = open ( 'a2.txt' , 'r' ,encoding = 'utf-8' ) print ( file .readline()) |
执行结果:
例4:把文本文件a2.txt中每一行都作为独立的字符串对象,并将这些对象放入列表返回
1 2 | file = open ( 'a2.txt' , 'r' ,encoding = 'utf-8' ) print ( file .readlines()) |
执行结果:
例5:将字符串写入到文件中
1 2 3 | file = open ( 'a3.txt' , 'w' ,encoding = 'utf-8' ) file .write( '抗疫必胜' ) file .close() |
执行完成后会生成一个a3.txt文件,内容为:抗疫必胜
例6:将列表数据写入a4.txt文件中
1 2 3 4 | file = open ( 'a4.txt' , 'a' ,encoding = 'utf-8' ) lst = [ 'java' , 'C++' , 'python' ] file .writelines(lst) file .close() |
执行结果:
例7:从第三个字符开始读取,读取到文件末尾
1 2 3 4 | file = open ( 'a4.txt' , 'r' ,encoding = 'utf-8' ) file .seek( 2 ) print ( file .read()) file .close() |
执行结果:
如果获取的是中文字符,因为一个中文占用的是2个字节,所以seek(1)会报错,必须使用seek(2)
例8:返回文件指针的当前位置
1 2 3 4 5 | file = open ( 'a4.txt' , 'r' ,encoding = 'utf-8' ) file .seek( 2 ) print ( file .read()) print ( file .tell()) file .close() |
执行结果:
说明:a4.txt文件内容为,这里面总共是26个字符,因为使用的是读取模式,所以指针的当前位置是26
例9:将缓冲区的文件写入文件,但不关闭文件
1 2 3 4 5 | file = open ( 'a2.txt' , 'a' ) file .write( 'hello' ) file .flush() file .write( 'world' ) file .close() |
执行结果:
说明:在a2.txt文件中追加hello,然后将hello先写入磁盘文件,然后再写入world
六、with语句(上下文管理器)
with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的
代码举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | '''上下文管理器''' ''' MyContentMgr实现了特殊方法__enter__()和__exit__()称为该类对象遵守了上下文管理器协议 该类对象的实例对象,就是上下文管理器 MyContentMgr() 就是上下文管理器 ''' class MyContentMgr( object ): def __enter__( self ): print ( '__enter__()方法被执行了' ) return self def __exit__( self , exc_type, exc_val, exc_tb): print ( '__exit__()方法被执行了' ) return self def show( self ): print ( 'show()方法被执行了' ) with MyContentMgr() as file : file .show() |
执行结果:
说明:MyContentMgr()这个上下文管理器重命名为file,file就是上下文管理器,file遵守了上下文管理协议,所有会先去执行__enter__()方法,然后执行show()方法,最后自动去执行__exit__()方法。这里需要注意的是,即使show()方法里报错了,也还是会去执行__exit__()方法。
练习:使用with语句复制一张图片
1 2 3 | with open ( 'test.png' , 'rb' ) as src_file: with open ( 'copytest.png' , 'wb' ) as target_file: target_file.write(src_file.read()) |
执行结果是成功生成一张copytest.png图片且内容与test.png内容一致。说明:因为使用了with语句,使用了上下文管理器,在离开with语句时会自动退出,所以这里不需要再写close()操作。
七、目录操作
os模块时Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样
os模块与os.path模块用于对目录或文件进行操作
代码举例:
例1:打开系统自带的记事本或计算器
1 2 3 | os.system( 'notepad' ) #打开记事本 os.system( 'calc.exe' ) #打开计算器 |
执行结果:
例2:直接调用可执行文件,例如打开QQ
1 2 | '''直接调用可执行文件''' os.startfile( 'd:\\Program Files (x86)\\Tencent\\QQ\\Bin\\qq.exe' ) |
执行结果:
os模块对目录及文件的操作相关函数
函数 | 说明 |
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
mkdirs(path1/path2...[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2...) | 删除多级目录 |
chdir(path) | 将path设置为当前工作目录 |
代码举例:
- 返回当前工作目录
1 | print (os.getcwd()) |
- 返回指定路径下的文件和目录信息
1 2 | lst = os.listdir( '../moduledemo' ) print (lst) |
- 创建目录
1 2 | '''创建目录''' os.mkdir( 'newdir' ) |
- 创建多级目录
1 | os.makedirs( 'A/B/C' ) |
执行结果:
- 删除目录
1 | os.rmdir( 'newdir' ) |
- 删除多级目录
1 | os.removedirs( 'A/B/C' ) |
- 将path设置为当前工作目录
1 2 | os.chdir( 'D:\\PycharmProjects\\print\\encodingdemo' ) print (os.getcwd()) |
os.path模块操作目录相关函数
函数 | 说明 |
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断文件或目录是否存在,如果存在返回True,否则返回False |
join(path,name) | 将目录与目录或者文件名拼接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为路径 |
代码举例:
------------------------------------------
遇到的问题:
1.当打开的文件内容是中文时,执行如下代码会报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 10: illegal multibyte sequence
1 2 3 | file = open ( 'a2.txt' , 'r' ) print ( file .readlines()) file .close() |
执行结果:
解决办法:需要在open方法里加一个 encoding='utf-8'
1 2 3 | file = open ( 'a2.txt' , 'r' ,encoding = 'utf-8' ) print ( file .readlines()) file .close() |
执行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统