点击蓝色“潭时录”关注我丫
每天和小潭一起快乐的学习~
你好,我是在学python的小潭。通过昨天的文章23-python中第三方模块的安装和使用我们熟悉了python中通过pip命令安装第三方模块的知识,今天我们将学习下python中编码格式和文件的相关操作知识。
(一)编码格式介绍
常见的字符编码格式
python的解释器使用的是Unicode(内存)
.py文件在磁盘上使用UTF-8存储(外存)
可在python文件中头部添加#encoding=gbk来指定.py使用gbk的编码格式。
(二)文件的读写原理
文件的读写又被称为'IO操作',操作流程和操作原理如下图所示。
(三)文件读写操作
内置函数open()创建文件对象
语法规则
file表示被创建的文件对象,open()为创建文件对象的函数,filename为要创建或打开的文件名称,mode为打开模式[可选,默认为只读],encoding为文件的编码格式[可选,默认文本文件中字符的编码格式为gbk]。
file = open(filename [,mode, encoding])
代码示例[同级目录下准备a.txt]:
file = open('a.txt', mode='r', encoding='UTF-8')print(file.readlines())file.close()
结果输出:
['小潭学python']
(四)文件对象常用的方法
文件的类型,按照文件中数据的组织形式,可以分为以下两大类
文本文件,存储普通字符文本,默认为unicode字符集,可以使用记事本程序打开
二进制文件,把数据内容用字节进行存储,无法使用记事本打开,需要使用特定的软件打开,例如mp4文件,jpg图片或doc文档等。
1.文件对象常用的打开模式:
打开模式 | 描述 |
r | 以只读模式打开文件,文件的指针将会放在文件的开头 |
w | 以只写模式打开文件,如果文件不存在则创建, 如果文件存在,则覆盖原有内容,文件指针在文件开头 |
a | 以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头, 如果文件存在,则在文件末尾追加内容,文件指针在原文件末尾 |
b | 以二进制模式打开文件,不能单独使用,需要和其他模式一起使用,如rb,wb等 |
+ | 以读写模式打开文件,不能单独使用,需要和其他模式一起使用,如a+ |
代码示例:
# w模式file = open('b.txt', 'w')file.write('小潭')file.close()# a模式file = open('b.txt', 'w')file.write('在学python')file.close()# rb模式src_file = open('b.txt', 'rb')target_file = open('copyb.txt', 'wb')target_file.write(src_file.read())target_file.close()src_file.close()
结果输出:
Process finished with exit code 0
2.文件对象常用的方法:
方法名 | 描述 |
read([size]) | 从文件中读取size个字节或字符的内容返回。 若省略[size]参数,则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入到列表返回 |
write(str) | 将字符串str内容写入文件 |
writelines(s_list) | 将字符串列表s_list写入文本文件,不添加换行符 |
seek(offset [,whence]) | 把文件指针移动到新的位置,offset表示相对于whence的位置。 offset:为正,往文件结束方向移动,为负则往文件开始方向移动 whence:不同的值代表不同含义,0表示从文件头开始计算(默认值),1表示从当前位置开始计算,2表示从文件末尾开始计算 |
tell() | 返回文件指针的当前位置 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源 |
代码示例:
file = open('c.txt', 'a+')print(file.read(2))lst = ['javascript', 'c']file.writelines(lst)file.seek(2)print(file.read())print(file.tell())file.write('hello')file.flush()file.write('world')file.close()
结果输出:
llojavac++goandpythonjavascriptchelloworldjavascriptc55
原始文件:
运行后结果:
(五)with语句
with语句可以自动管理上下文资源,不论什么原因跳出with语句块,都能确保文件正确关闭,同时释放资源。
语法格式:
open('log.txt', 'r')为上下文表达式[open()实现了__enter__()方法和__exit__()方法,遵守了上下文管理协议],对应示例对象被称为上下文管理器,同时创建一个运行时上下文,自动调用__enter__()方法,并将返回值赋值给src_file[可选,上下文管理器对象的引用],离开运行时上下文,程序将自动调用上下文管理器的特殊方法__exit__()。
with open('log.txt', 'r') as src_file: src_file.read() # with语句体
代码示例1:
class MyContentMgr: # 实现了__enter__()方法和__exit__()方法,遵守了上下文管理协议 def __enter__(self): print('enter方法被调用执行') return self def __exit__(self, exc_type, exc_val, exc_tb): print('exit方法被调用执行') def show(self): print('show方法被调用执行', 1/0) # 写入异常with MyContentMgr() as file: # 相当于file = MyContentMgr() file.show()
结果输出[存在异常,exit方法仍被执行]:
Traceback (most recent call last): file.show() print('show方法被调用执行', 1/0) # 写入异常ZeroDivisionError: division by zeroenter方法被调用执行exit方法被调用执行
代码示例2:
print(type(open('b.txt', 'r')))with open('b.txt', 'r') as src_file: print(src_file.read())
结果输出:
<class '_io.TextIOWrapper'>在学python小潭
(六)目录操作
os模块是python内置的与操作系统功能和文件系统相关的模块,该模块中的语句执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
os模块与os.path模块用于对目录或文件进行操作。
代码格式:
import osos.system('notepad.exe')os.system('calc.exe')# 直接调用可执行文件os.startfile('C:\\Program Files\\Tencent\WeChat\WeChat.ext')
1.os模块操作目录相关的函数:
函数 | 描述 |
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path [, mode]) | 创建目录 |
makedirs(path1/path2...[, mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2...) | 删除多级目录 |
chdir(path) | 将path设置为当前工作目录 |
代码示例:
import os# 打印目录路径print(os.getcwd())# 创建目录os.mkdir('newdir')os.makedirs('A/B/C')# 列举目录内容lst = os.listdir('../cap15')print(lst)# 删除目录os.rmdir('newdir')os.removedirs('A/B/C')# 指定目录os.chdir('../')print(os.getcwd())
结果输出:
D:\Python\cap15['A', 'a.txt', 'b.txt', 'c.txt', 'copyb.txt', 'demo1.py', 'demo2.py', 'demo3.py', 'demo4.py', 'demo5.py', 'demo6.py', 'demo7.py', 'newdir']D:\Python
2.os.path模块操作目录相关函数:
补充,可使用os模块中的walk()函数获取整个目录结构。
函数 | 描述 |
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断文件或目录是否存在, 如果存在返回True,否则返回False |
join(path, name) | 将目录与目录或文件拼接起来 |
splitext() | 分离文件和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为路径 |
代码示例1:
import os.pathprint(os.path.abspath('demo8.py'))print(os.path.exists('demo1.py'), os.path.exists('demo9.py'))print(os.path.join('D:\\Python', 'demo8.py'))print(os.path.split('D:\\Python\\cap15\\demo8.py'))print(os.path.splitext('demo8.py'))print(os.path.basename('D:\\Python\\cap15\\demo8.py'))print(os.path.dirname('D:\\Python\\cap15\\demo8.py'))print(os.path.isdir('D:\\Python\\cap15\\demo8.py'))
结果输出:
D:\Python\cap15\demo8.pyTrue FalseD:\Python\demo8.py('D:\\Python\\cap15', 'demo8.py')('demo8', '.py')demo8.pyD:\Python\cap15False
代码示例2:
# 使用os.walk()分层级遍历目录import ospath = os.getcwd()lst_files = os.walk(path)for dirpath, dirname, filename in lst_files: print(dirpath) print(dirname) print(filename) print('----------------') # 使用os.walk()分层级遍历目录并输出文件路径import ospath = os.getcwd()lst_files = os.walk(path)for dirpath, dirname, filename in lst_files: for dir in dirname: print(os.path.join(dirpath, dir)) for file in filename: print(os.path.join(dirpath, file)) print('----------------')
结果输出:
# 使用os.walk()分层级遍历目录D:\Python\cap15['sub']['a.txt', 'b.txt', 'c.txt', 'copyb.txt', 'demo1.py', 'demo2.py', 'demo3.py', 'demo4.py', 'demo5.py', 'demo6.py', 'demo7.py', 'demo8.py', 'demo9.py']----------------D:\Python\cap15\sub['sub1']['1.py']----------------D:\Python\cap15\sub\sub1[]['sub_1.py']----------------# 使用os.walk()分层级遍历目录并输出文件路径D:\Python\cap15\subD:\Python\cap15\a.txtD:\Python\cap15\b.txtD:\Python\cap15\c.txtD:\Python\cap15\copyb.txtD:\Python\cap15\demo1.pyD:\Python\cap15\demo2.pyD:\Python\cap15\demo3.pyD:\Python\cap15\demo4.pyD:\Python\cap15\demo5.pyD:\Python\cap15\demo6.pyD:\Python\cap15\demo7.pyD:\Python\cap15\demo8.pyD:\Python\cap15\demo9.py----------------D:\Python\cap15\sub\sub1D:\Python\cap15\sub\1.py----------------D:\Python\cap15\sub\sub1\sub_1.py----------------
以上是python中编码格式和文件相关的操作知识。至此,我们已学习了全部的python基础部分,如果感觉掌握的还不是很牢固,可以返回01-写在之前,从开始再巩固一遍哦。
在接下来的推文中,我们将陆续进入python基础实战部分的学习,使用已学到的python基础知识进行一些小项目的开发,敬请期待。
下期预告:python基础实战——简易版学生信息管理系统