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

      执行结果:

  • 相关阅读:
    hdu-2544-最短路(Bellman-Ford算法模板)
    hdu-2544-最短路(dijkstra算法模板)
    C++结构体成员列表初始化
    hdu-3790-最短路径问题(Dijkstra)
    hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)
    nyoj-1278-Prototypes analyze(二叉排序树模板)
    hdu-5183-Negative and Positive (NP)(hash模板)
    nyoj-130-相同的雪花(hash)
    01 格式化输出
    003 标准数据类型简介 + 数字类型
  • 原文地址:https://www.cnblogs.com/wx170119/p/14569754.html
Copyright © 2020-2023  润新知