编码格式
一、内容目录
1.编码格式的介绍
2.文件读写原理
3.文件读写操作
4.文件对象常用的方法
5.with语句
6.目录操作
二、编码格式的介绍
1.常见的字符编码格式
Python的解释器使用的是Unicode(内存)
.py文件在磁盘上使用UTF-8存储(外存)
Python中默认使用UTF-8编码,如果要使用其它编码方式,则需要手动加入代码
#encoding=gbk
在代码文件的第一行加入#encoding=gbk
三、文件读写原理
1.文件的读写俗称“IO操作”
2.文件读写操作流程
3. 读写操作原理
说明:.py文件经过解释器解释后,调用操作系统对硬盘文件进行读写操作
4.内置函数open()创建文件对象
说明:读入和写出都是相对内存而言的,读就表示内存从磁盘上读取文件内容到内存中,写就是从内存中把内容写入磁盘中保存
5.语法规则
语法格式:file = open( filename[,mode,encoding])
其中file是被创建的文件对象,open是创建文件对象的方法,filename是要创建或打开的文件名称,mode为打开文件的模式,默认是只读,encoding是打开文件的编码方式,默认文本中字符的编写格式为gbk
文件读写代码举例:
file=open('a2.txt','r',encoding='utf-8') print(file.readlines()) file.close()
执行结果:
说明:readlines的结果是一个列表,会将文件的内容全部读取出来
四、常用的文件读取模式
文件的类型
按文件中数据的组织形式,文件分为以下两大类
文本文件:存储的是普通“字符”文本,默认为unicode字符集,可以使用记事本程序打开
二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:MP3音频文件,jpg图片,.doc文档等
代码举例:
例1:以只读方式读取文件并打印内容(a2.txt文件和.py文件在同一个目录下)
file=open('a2.txt','r',encoding='utf-8') print(file.readlines()) file.close()
执行结果:
例2:以只写模式打开文件,当文件不存在时新建文件,文件存在时则覆盖原内容
- 当文件不存在时新建文件
file=open('b.txt','w',encoding='utf-8') file.write('hello world') file.close()
执行结果:生成了b.txt,并且将 hello world 写入到了b.txt中
- 文件存在时则覆盖原内容
file=open('b.txt','w',encoding='utf-8') file.write('Python') #用 Python 替换原文件中的 hello world file.close()
执行结果:
例3:将目录下的test.png复制一份,并重命名为copypng.png
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:读取文件的全部内容
file=open('a2.txt','r',encoding='utf-8') print(file.read())
执行结果:将a2.txt文件中的所有内容读取了出来
例2:从文件中读取2个字节的内容并返回
file=open('a2.txt','r',encoding='utf-8') print(file.read(2))
执行结果:
例3:从文件中读取一行数据
file=open('a2.txt','r',encoding='utf-8') print(file.readline())
执行结果:
例4:把文本文件a2.txt中每一行都作为独立的字符串对象,并将这些对象放入列表返回
file=open('a2.txt','r',encoding='utf-8') print(file.readlines())
执行结果:
例5:将字符串写入到文件中
file=open('a3.txt','w',encoding='utf-8') file.write('抗疫必胜') file.close()
执行完成后会生成一个a3.txt文件,内容为:抗疫必胜
例6:将列表数据写入a4.txt文件中
file=open('a4.txt','a',encoding='utf-8') lst=['java','C++','python'] file.writelines(lst) file.close()
执行结果:
例7:从第三个字符开始读取,读取到文件末尾
file=open('a4.txt','r',encoding='utf-8') file.seek(2) print(file.read()) file.close()
执行结果:
如果获取的是中文字符,因为一个中文占用的是2个字节,所以seek(1)会报错,必须使用seek(2)
例8:返回文件指针的当前位置
file=open('a4.txt','r',encoding='utf-8') file.seek(2) print(file.read()) print(file.tell()) file.close()
执行结果:
说明:a4.txt文件内容为,这里面总共是26个字符,因为使用的是读取模式,所以指针的当前位置是26
例9:将缓冲区的文件写入文件,但不关闭文件
file=open('a2.txt','a') file.write('hello') file.flush() file.write('world') file.close()
执行结果:
说明:在a2.txt文件中追加hello,然后将hello先写入磁盘文件,然后再写入world
六、with语句(上下文管理器)
with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的
代码举例:
'''上下文管理器''' ''' 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语句复制一张图片
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:打开系统自带的记事本或计算器
os.system('notepad') #打开记事本 os.system('calc.exe') #打开计算器
执行结果:
例2:直接调用可执行文件,例如打开QQ
'''直接调用可执行文件''' 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设置为当前工作目录 |
代码举例:
- 返回当前工作目录
print(os.getcwd())
- 返回指定路径下的文件和目录信息
lst=os.listdir('../moduledemo') print(lst)
- 创建目录
'''创建目录''' os.mkdir('newdir')
- 创建多级目录
os.makedirs('A/B/C')
执行结果:
- 删除目录
os.rmdir('newdir')
- 删除多级目录
os.removedirs('A/B/C')
- 将path设置为当前工作目录
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
file=open('a2.txt','r') print(file.readlines()) file.close()
执行结果:
解决办法:需要在open方法里加一个 encoding='utf-8'
file=open('a2.txt','r',encoding='utf-8') print(file.readlines()) file.close()
执行结果: