• python笔记3


    file 对象使用 open 函数来创建,下面说一下对文件的操作分三步:

    1、打开文件获取文件的句柄,句柄就理解为这个文件

    2、通过文件句柄操作文件,读取/写入文件内容

    3、关闭文件。

    注意:

    文件打开模式有3种:

    1. w 写模式,不能读取,只能写入,若文件不存在,则创建

    2. r 读模式,不能写入,只能读取,而且文件必须存在;若不传文件打开模式,则默认是 r 读模式

    3. a 追加模式,只能写入,在文件末尾添加内容

    以w模式打开文件,写入内容,如下:

    fp = open('file.txt','w')
    fp.write('hhh')  #若以w模式打开存在的文件,会清空以前的文件内容,重新写入hhh

    以r模式打开文件,读取文件内容,如下:

    fp = open('file.txt', 'r', encoding='utf-8')  #windows 的默认字符集是gbk,需要设置为utf-8,encoding参数可以指定文件的编码
    print(fp.read())    #读取文件内容,返回结果类型是字符串

    以r模式打开不存在的文件,如下:

    fp = open('a.txt', 'r')  #若打开的文件不存在,则报错:FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'
    print(fp.read())

    以a模式打开不存在的文件,写入内容,如下:

    fp = open('a.txt', 'a')  #写入不存在的文件名,a追加模式,若文件不存在则创建
    fp.write('yiy')          #在文件末尾添加内容

    以下是文件常用的操作方法:

    read()、readline()、readlines() 读取文件内容操作:

    fp = open('file.txt', 'a+')   #a+模式,指针在文件最后的位置,需要将指针移动到初始文件,才能读取内容
    fp.seek(0)                    #多次读取文件内容时,一定要将游标移动到初始位置,否则读取内容为空
    print(fp.read())              #读取文件内容,返回的是字符串,指针移动到最后位置,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
    fp.seek(0) #将指针移动到初始位置
    print(fp.readlines()) #读取文件内容,返回的是一个列表,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
    fp.seek(0)
    print(fp.readline()) #只读取文件内容的一行内容,返回的是字符串

    大文件时,读取文件高效的操作方法

    用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放了:

     f = open('file.txt')
     for line in f:
         print(line)
    这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存

    write()、writelines() 写入文件内容操作:

    fp = open('file.txt', 'a+')
    fp.write('2222'+'
    ')                       #写文件时,只能写入字符串
    fp.writelines(['123
    ', '456
    ', '789'])    #writelines可以将列表写入文件
    fp.seek(0)
    print(fp.readlines())            #执行结果:['2222
    ', '123
    ', '456
    ', '789']

    flush()刷新文件内容缓冲,如下:

    import time
    fp = open('file.txt', 'w')  #以w模式打开文件
    fp.write('欢乐颂')          #写入文件内容
    fp.flush()                  #刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入
    time.sleep(30)              #sleep时间是30s
    fp.close()                 #关闭文件

    tell()查看游标的位置:

    fp = open('file.txt', 'r+')
    print(fp.read())   #读取文件内容,执行结果:abcdefg
    print(fp.tell())   #查看游标所在位置,游标在最后一位
    fp.seek(0)         #将游标移动到初始位置
    print(fp.tell())   #将游标移动到初始位置后,查看游标所在位置
    fp.seek(2)         #将游标移动到第2位
    print(fp.tell())   #将游标移动到初始位置后,查看游标所在位置,游标在第二位
    fp.seek(0, 2)      #将游标移动到最末尾
    print(fp.tell())    #将游标移动到初始位置后,查看游标所在位置,游标在最末尾

    truncate(size)截取指定长度的内容:

    fp = open('file.txt', 'r+')  #file.txt文件内容为abcdefg
    print(fp.tell())
    #fp.truncate()  #若没有指定size,则清空文件内容
    fp.truncate(3)  #传入size,表示从0开始截断3位字符,其余的清除
    fp.seek(0)
    print(fp.read())  #执行结果为:abc

    with用法,打开文件后,可以不手动关闭,文件不进行操作时,自动关闭,如下:

    #with用法 open(文件名) as 别名,默认打开方式是 r模式
    with open('file.txt') as fp:
        print(fp.read())

    使用with打开多个文件,写法如下:

    with open('file.txt') as fp, open('a.txt') as fw:
        for line in fp:
            print(line)
        print(fw.readlines())

    修改文件的话,有两种方式,一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容;第二种是把修改后的文件内容写到一个新的文件中:

    第一种:

    fp = open('file.txt', 'a+')
    fp.seek(0)
    res = fp.read()        #返回结果类型是字符串,指针在最后面
    fp.seek(0)             #将指针移动到初始位置
    fp.truncate()          #清空文件内容
    new_res = res.replace('a', 'hello')  #将a字符串替换为hello,替换后为新的字符串内容
    fp.write(new_res)      #将替换后的内容写入文件

    第二种:

    import os
    fp = open('file.txt', 'a+')
    fp.seek(0)
    fw = open('a.txt', 'w')   #打开第二个文件,专门写入替换后的文件内容
    for line in fp:          #直接循环文件对象,循环的是文件每一行的内容
        new_res = line.replace('hello', '666')  #将hello替换为666,替换后为新的字符串内容
        fw.write(new_res)    #将修改后的内容写入第二个文件
    fp.close()               #关闭文件,关闭后不能再进行读写操作
    fw.close()
    os.remove('file.txt')           #删除替换以前的文件
    os.replace('a.txt', 'file.txt')  #将新文件名替换为已删除的文件名
    import os
    with open('file.txt') as fp, open('a.txt', 'w') as fw:
        for line in fp:
            new_res = line.replace('666', 'hello')
            fw.write(new_res)
    os.remove('file.txt')
    os.replace('a.txt', 'file.txt')

    下表列出了 file 对象常用的函数:

    序号方法及描述
    1

    file.close()

    关闭文件。关闭后文件不能再进行读写操作。

    2

    file.flush()

    刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

    3

    file.fileno()

    返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

    4

    file.isatty()

    如果文件连接到一个终端设备返回 True,否则返回 False。

    5

    file.next()

    返回文件下一行。

    6

    file.read([size])

    从文件读取指定的字节数,如果未给定或为负则读取所有。

    7

    file.readline([size])

    读取整行,包括 " " 字符。

    8

    file.readlines([sizehint])

    读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比sizhint较大, 因为需要填充缓冲区。

    9

    file.seek(offset[, whence])

    设置文件当前位置

    10

    file.tell()

    返回文件当前位置。

    11

    file.truncate([size])

    截取文件,截取的字节通过size指定,默认为当前文件位置。

    12

    file.write(str)

    将字符串写入文件,没有返回值。

    13

    file.writelines(sequence)

    向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

  • 相关阅读:
    N天学习一个linux命令之scp
    php svn仓库提交预处理
    NTP-网络时间协议
    N天学习一个linux命令之umask
    N天学习一个linux命令之xz
    N天学习一个linux命令之xargs
    N天学习一个Linux命令之hostnamectl
    jQuery easyUI的datagrid,如何在翻页以后仍能记录被选中的行
    multiselect2side:jQuery多选列表框插件
    springmvc+jquery实现省市区地址下拉框联动
  • 原文地址:https://www.cnblogs.com/lhly/p/6919062.html
Copyright © 2020-2023  润新知