Python学习

作者: 逛逛_堆栈 | 来源:发表于2021-04-02 10:25 被阅读0次

    第七天

    回顾
    我们前面说过变量、序列、对象,但变量、序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中。Python提供了内置的文件对象,以及对文件、目录进行操作的内置模块,通过这些技术可以很方便地将数据保存到文件中。

    Python文件基本操作

    python中文件的操作通常可以分成两类:
    1.系统级操作:删除、修改权限,作用于文件本身
    2.应用级操作:读、写操作,作用于文件内容
    思考:如何用word编写一份简历?
    1、打开新建一个word文件;
    2、写入个人信息并保存文件;
    3、关闭word软件。
    对于文件应用的操作通常有着较为固定的格式,可以归纳如下所示:

    1.打开open文件,使用open()函数,返回一个文件对象;
    2.读写read/write文件,这里主要有读文件有read(),readline(),readlines()函数;而写文件就有write()、writelines()函数;
    3.关闭close文件,完成对文件的读写之后,需要对文件进行关闭,调用close()函数。
    一个文件,必须在打开之后才能对其进行操作,并且在操作结束之后,还应该将其关闭,这 3 步的顺序不能打乱。

    1、Python open函数

    open函数

    Python中如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。

    语法:file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])

    file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。

    mode:可选参数,用于指定文件的打开模式。可选的打开模式如表 1 所示。如果不写,则默认以只读(r)模式打开文件。
    注意:文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法修改文件内容。

    r、只读模式打开文件,读文件内容的指针会放在文件的开头。
    rb、以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。
    r+、打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。
    rb+、以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。
    w、以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。
    wb、以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件)
    w+、打开文件后,会对原有内容进行清空,并对该文件有读写权限。
    wb+、以二进制格式、读写模式打开文件,一般用于非文本文件
    a、以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾,反之则会创建新文件。
    ab、以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾,反之则会创建新文件。
    a+、以读写模式打开文件;如果文件存在,文件指针放在文件的末尾,反之则会创建新文件。
    ab+、以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾;反之,则创建新文件。
    

    buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区。

    通常情况下、建议大家在使用 open() 函数时打开缓冲区,即不需要修改 buffing 参数的值。
    如果 buffing 参数的值为 0(或者 False),则表示在打开指定文件时不使用缓冲区;如果 buffing 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(单位是字节);如果 buffing 参数的值为负数,则代表使用默认的缓冲区大小。
    

    encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)。

    open()文件对象常用的属性

    成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:

    file.name:返回文件的名称;
    file.mode:返回打开文件时,采用的文件打开模式;
    file.encoding:返回打开文件时使用的编码格式;
    file.closed:判断文件是否己经关闭。

    import os
    file = open('1.txt','r')
    print(file.mode)  # 'r'
    print(file.encoding)  # cp936
    print(file.name)   # 1.txt
    print(file.close())  # None
    

    注意,使用 open() 函数打开的文件对象,必须手动进行关闭,Python 垃圾回收机制无法自动回收打开文件所占用的资源。

    2、Python read函数

    Python提供了如下 3 种函数,它们都可以帮我们实现读取文件中数据的操作:

    1、read() 函数:逐个字节或者字符读取文件中的内容;

    借助 open() 函数,并以可读模式(包括 r、r+、rb、rb+)打开的文件,可以调用 read() 函数逐个字节(或者逐个字符)读取文件中的内容。
    格式:file.read([size])
    file 表示打开的文件对象;size 作为一个可选参数,用于指定要读取的字符个数,如果省略,则默认一次性读取所有内容。

    # import  os
    # file = open('1.txt','r')  # 1.txt中是中文
    # str = file.read(3)
    # print(str)
    # file.close()
    # 'gbk' codec can't decode byte 0xac
    import  os
    file = open('1.txt','r',encoding='utf-8')
    str = file.read(3)
    print(str)  # 哈哈哈
    file.close()
    

    2、readline() 函数:逐行读取文件中的内容;

    readline() 函数用于读取文件中的一行,包含最后的换行符“\n”。此函数的基本语法格式为: file.readline([size])。

    import  os
    file = open('1.txt','r',encoding='utf-8')
    str = file.readline()
    print(str)  # 我是第一行第一列数据   我是第一行第二列数据
    file.close()
    

    注意:由于 readline() 函数在读取文件中一行的内容时,会读取最后的换行符“\n”,再加上 print() 函数输出内容时默认会换行,所以输出结果中会看到多出了一个空行,实际在控制台的效果是两行。

    3、readlines() 函数:一次性读取文件中多行内容。

    readlines() 函数用于读取文件中的所有行,和 readline() 函数一样,readlines() 函数在读取每一行时,会连同行尾的换行符一块读取。

    import  os
    file = open('1.txt','r',encoding='utf-8')
    str = file.readlines()
    print(str)
    file.close()
    # ['我是第一行第一列数据      我是第一行第二列数据\n', '我是第二行第一列数据      我是第二行第二列数据']
    

    3、Python write函数

    前面我们说了使用 read()、readline() 和 readlines() 这 3 个函数读取文件,如果我们想把一些数据保存到文件中,又该如何实现呢?这个时候就需要用到python中的write、writelines函数了。

    1、write函数

    语法:file.write(string)
    其中,file 表示已经打开的文件对象;string 表示要写入文件的字符串(或字节串,仅适用写入二进制文件中)。
    注意,在使用 write() 向文件中写入数据,需保证使用 open() 函数是以 r+、w、w+、a 或 a+ 的模式打开文件,否则执行 write() 函数会抛出 io.UnsupportedOperation 错误。

    import  os
    file = open('2.txt','w',encoding='utf-8')
    file.write('首次写入数据')
    file.close()
    

    注意:打开文件模式中包含 w(写入),那么向文件中写入内容时,会先清空原文件中的内容,然后再写入新的内容。因此运行上面程序,再次打开 a.txt 文件,只会看到新写入的内容。

    追加模式打开文件,则不会清空原有内容,而是将新写入的内容会添加到原内容后边。

    import  os
    file = open('2.txt','a',encoding='utf-8')
    file.write('首次写入数据5\n')
    file.close()
    

    注意:不论是采用那种方式写入数据,file.close不可缺少。当我们在写入文件内容时,操作系统不会立刻把数据写入磁盘,而是先缓存起来,只有调用 close() 函数时,操作系统才会保证把没有写入的数据全部写入磁盘文件中。

    2、writelines函数

    Python 的文件对象中,不仅提供了 write() 函数,还提供了 writelines() 函数,可以实现将字符串列表写入文件中。

    # 将一个文件中所有内容复制到另一个文件
    import  os
    open_file = open('1.txt','r',encoding='utf-8')
    write_file = open('3.txt','w',encoding='utf-8')
    write_file.writelines(open_file.read())
    write_file.close()
    open_file.close()
    

    注意:使用 writelines() 函数向文件中写入多行数据时,不会自动给各行添加换行符。

    4、Python tell和seek

    1、Python tell函数

    tell() 函数用于判断文件指针当前所处的位置。语法:file.tell()。

    import  os
    read_file = open('2.txt','r',encoding='utf-8')
    print(read_file.tell())  # 0
    print(read_file.read(3)) # 日照香
    print(read_file.tell())  # 9
    read_file.close()
    #utf-8编码:一个中文包含繁体字等于三个字节,一个英文字符一个字节。
    #gbk编码:一个中文包含繁体字等于二个字节,一个英文字符一个字节。
    

    2、Python seek函数

    seek() 函数用于将文件指针移动至指定位置,该函数的语法格式如下:

    file.seek(offset[, whence])

    各个参数的含义如下:

    offset:表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。例如,当whence == 0 &&offset == 3(即 seek(3,0) ),表示文件指针移动至距离文件开头处 3 个字符的位置;当whence == 1 &&offset == 5(即 seek(5,1) ),表示文件指针向后移动,移动至距离当前位置 5 个字符处。

    whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。

    注意,当 offset 值非 0 时,Python 要求文件必须要以二进制格式打开,否则会抛出 io.UnsupportedOperation 错误。

    read_file = open('2.txt','rb') # 二进制不要设置编码集
    print(read_file.tell()) # 指针初始位置 0
    print(read_file.read(1)) 
    print(read_file.tell())  # 1
    read_file.seek(5) # 将文件指针从文件开头,向后移动到 5 个字符的位置
    print(read_file.tell())  # 5
    print(read_file.read(1))
    read_file.seek(5,1)
    print(read_file.tell())  # 11
    read_file.close()
    

    5、Python with as使用

    Python中使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。使用 with as 操作已经打开的文件对象,无论期间是否抛出异常,都能保证 with as 语句执行完毕后自动关闭已经打开的文件。

    语法:
    with 表达式 [as target]:
    代码块

    import  os
    with open('4.txt','w') as w_file:
        w_file.write('Good Job')
    

    优点:

    1、自动释放对象,不需要我们手动close;

    2、优化try/catch,导致代码复杂化;

    3、保障程序的正常执行。

    相关文章

      网友评论

        本文标题:Python学习

        本文链接:https://www.haomeiwen.com/subject/reyfkltx.html