Python学习系列之编码格式(三十四)

编码格式

一、内容目录

  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()

  执行结果:

原文地址:https://www.cnblogs.com/wx170119/p/14569754.html