• 13、文件处理



    13.0、说明:

    1、文件处理的步骤:

    (1)打开文件时需要指定文件路劲和以何种方式打开文件,打开后即可获取该文件

    句柄;

    (2)通过句柄对文件进行操作;

    (3)关闭文件;

    (4)注意:

    1)文件处理的数据内容全部为字符串类型,如果是其它数据类型会报错;

    2)对文件的处理以光标所在的位置为起点,启动程序时光标默认从头开始;

    3)对文件的修改操作实质是将文件读取(r操作)到内存中,在内存中进行修改,然后再覆盖(w操作)原文件或创建新的文件;

    2、打开文件的模式:

    1)r:只读模式,默认模式,文件必须存在,不存在则抛出异常;

    (2)w:只写模式,不可读,不存在则创建,存在则清空(类似于linux中写入重定向'>');

    (3)x:只写模式,不可读,不存在则创建,存在则报错;

    (4)a:追加模式,不可读,不存在则创建,存在则只追加内容(类似于Linux中的追加重定向'>>');

    (5)注意:默认处理的文本模式(t),比如(rt),如果处理视频图片等其它格式的内容使用"b"来操作;

    3、"+"表示可以同时读写某个文件:

    说明:该模式是在原有打开文件模式上新增读或写功能

    (1)r+:读写,可读,可写;

    (2)w+:写读,可读,可写;

    (3)x+:写读,可读,可写;

    (4)a+:写读,可读,可写;

    4、"b"表示以字节的方式操作:

    注意:b模式打开文件时不能指定编码,但也要保证编码和解码的一致性

    (1)rb 或 r+b;

    (2)wb 或 w+b;

    (3)xb 或 x+b;

    (4)ab 或 a+b;


    13.1、文件处理读操作(r):

    只能读,文件不存在会报错;

    1、读取全部内容:

    f=open('告白气球',encoding='utf-8')

    # 打开文件句柄,编码要和文件存储的编码一致,如果不写编码格式,默认会调取操作系统的编码;

    print(f.encoding)

    # 表示当前读取的文件是用什么编码格式进行解码

    print(f.readable())

    # 判断文件是否为可读,可读返回True,不可读返回False;

    data=f.read()

    # 读取文件的所有内容

    print(data)

    f.close()

    # 关闭文件句柄

    print(f.closed)

    # 判断打开的文件句柄是否已经关闭,True表示已经关闭,false表示没有关闭

    print(f.name)

    # 打印打开文件的文件名


    2、按行读取:

    f=open('告白气球',encoding='utf-8')

    print('第1行',f.readline())

    print('第2行',f.readline(),end='')

    # 按行读取,默认读取后会加换行符( ),"end=''"表示取消换行符,读取一行,

    # 光标往下移动一行;

    print('第3行',f.readline(),end='')

    f.close()


    3、将文件的每行以当作列表每个元素的方式进行输出:

    f=open('告白气球',encoding='utf-8')

    data=f.readlines()

    print(data)

    f.close()


    #输出格式:

    ['塞纳河畔 左岸的咖啡 ', '我手一杯 品尝你的美 ', '留下唇印 的嘴']


    13.2、文件处理写操作(w):

    只能写,文件存不存在都会新建文件;

    1、向文件中写入数据:

    f=open('告白气球','w',encoding='utf-8')

    f.writable()

    # 判断文件是否可写

    f.write('111 ')

    f.write('222 ')

    f.write('333 4444 555 ')

    # 向文件中写入内容

    f.close()


    2、以列表的形式往文件中写入数据:

    f=open('告白气球','w',encoding='utf-8')

    f.writelines(['111 ','222 '])

    f.close()


    13.3、文件处理追加操作(a):

    文件不存在时创建新的文件,文件存在时往文件中追加

    1、追加操作:

    f=open('告白气球','a',encoding='utf-8')

    f.write('写到最后一行 ')

    f.close()


    13.4、文件处理修改文件操作:

    对文件的修改操作实质是将文件读取(r操作)到内存中,在内存中进行修改,然后再覆盖(w操作)原文件或创建新的文件;

    1、覆盖操作:

    f=open('告白气球','r+',encoding='utf-8')

    print(f.readable())

    f.write('哈哈')

    # 文件第一行的前两个字会被覆盖,因为光标从第一行的第一个字符开始;

    f.close()


    2、文件修改:

    src_f=open('告白气球','r',encoding='utf-8')

    data=src_f.readlines()

    src_f.close()


    dst_f=open('告白气球','w',encoding='utf-8')

    # dst_f.writelines(data)

    dst_f.write(data[0])

    dst_f.close()


    3、拷贝文件:

    with open('告白气球','r',encoding='utf-8') as src_f,

    open('告白气球_new','w',encoding='utf-8') as dst_f:

    data=src_f.read()

    dst_f.write(data)


    说明:使用

    with open('a.txt','w') as f:

    f.write('1111 ')

    的方式操作文件可以自动关闭文件句柄;


    with open('告白气球','r',encoding='gbk') as src_f,

    open('告白气球_new','w',encoding='utf-8') as dst_f:

    data=src_f.read()

    dst_f.write(data)

    #文件解码后可以转换成其它的编码格式


    13.5、文件处理模式之b模式:

    # 注意:b模式打开文件时不能指定编码,但也要保证编码和解码的一致性;

    1、rb模式:

    f = open('告白气球', 'rb')

    # b的方式不能指定编码,b的方式不能指定编码

    data = f.read()

    print(data)

    print(data.decode('utf-8'))

    # '字符串'---------encode---------》bytes

    # bytes---------decode---------》'字符串'

    f.close()


    2、wb模式:

    f = open('告白气球', 'wb')

    f.write(bytes('方丈山 ', encoding='utf-8'))

    f.write('周杰伦'.encode('utf-8'))

    f.close()


    3、ab模式:

    f = open('告白气球', 'ab')

    f.write(bytes('方丈山 ', encoding='utf-8'))

    f.write('周杰伦'.encode('utf-8'))

    f.close()


    4、使用b模式复制文件:

    f = open('告白气球', 'rb')

    data=f.read()

    f.close()

    f1 = open('告白气球_new', 'wb')

    f1.write(data)

    f1.close()


    13.6、文件操作的其它方法:

    1、newline='' :

    f=open('告白气球','r',encoding='utf-8',newline='')

    # 在linux下换行符是 ,在windows下换行符是

    # python默认做了处理,在windows下使用 作为换行符,隐藏了 (即是隐藏了也占一个字节)

    # newline='' 表示不不隐藏windows平台下换行符中的 ,读取文件中真正的换行符号

    print(f.tell())

    # 光标在文件的第几个字节

    print(f.readlines())

    f.readline()

    print(f.tell())

    f.close()


    #输出结果如下:

    #0

    #['塞纳河畔 左岸的咖啡 ', '我手一杯 品尝你的美']

    #58


    2、绝对位置的seek(默认):

    #可以以b模式打开,也可以使用普通文本模式打开

    f = open('告白气球', 'r', encoding='utf-8')

    print(f.tell())

    f.seek(10)

    # 等价于f.seek(3,0),表示从开头开始算,将光标移动到第10个字节

    print(f.tell())

    f.seek(3)

    # 从开头开始算,将光标移动到第3个字节

    print(f.tell())

    data = f.read(3)

    # 从文件中读取3个字符

    print(data)


    #输出结果如下:

    #0

    #10

    #3

    #纳河畔


    3、相对位置的seek:

    # 必须以b的模式打开

    f = open('告白气球', 'rb')

    print(f.tell())

    f.seek(10,1)

    # 相对于上一个光标的位置移动10个字节

    print(f.tell())

    f.seek(3,1)

    # 相对于上一个光标的位置移动10个字节

    print(f.tell())


    #输出结果如下:

    #0

    #10

    #13


    4、倒着方式的seek:

    # 必须以b的模式打开

    f = open('告白气球', 'rb')

    print(f.tell())

    f.seek(-6, 2)

    # 将光标从文件的末尾向前移动6个字节(即两个汉字的位置)

    print(f.tell())

    print(f.read().decode('utf8'))

    # 从现在光标所在的位置往后读

    print(f.tell())


    #输出的结果如下:

    #0

    #52

    #的美

    #58


    5、文件截取操作(truncate)

    #注意:因为截取是对文件的修改操作,所以必须有写的权限,但是w和w+除外

    f = open('告白气球', 'r+', encoding='utf-8')

    f.truncate(3)

    #从开头开始算,将文件只保留从0-3个字节的内容(即一个汉字)


    6、读取日志文件的最后一行:

    (1)使用列表的形式:

    f=open('日志文件','rb')

    data=f.readlines()

    print(data[-1].decode())


    # 缺点:将所有日志都读出来放进一个列表内,由于该列表是放到内存中的,所以当日志量比较

    # 大时会消耗系统的内存;


    (2)使用for循环的方式:

    f = open('日志文件', 'rb')

    for i in f:

    print(i.decode('utf8'),end='')


    # 优点:从文件中取出一行日志放到内存中,如果不是想要的结果就丢弃,循环该操作,直至找到

    # 想要的结果为止,比较节约系统的内存;


    (3)读取大文件最后一行(最快的方式):

    f = open('日志文件', 'rb')

    offs = -10

    # 指定偏移量

    while True:

    f.seek(offs, 2)

    # 从文件末尾向前移动10个字节

    data = f.readlines()

    # 读取光标后面的字节组成列表的形式

    if len(data) > 1:

    print('文件的最后一行是%s' % (data[-1].decode('utf-8')))

    # 取出列表中最后一行

    break

    offs *= 2

    # 列表不满足一行,增大偏移量,进入下一次循环


    13.7、小结:

    1、f.flush()

    #将文件内容从内存刷到硬盘

    2、f.closed

    #文件如果关闭则返回True

    3、f.encoding

    #查看使用open打开文件的编码

    4、f.tell()

    # 查看文件处理当前的光标位置,文件必须可读

    5、f.seek(3)

    #从开头开始算,将光标移动到第三个字节,文件必须可读

    6、f.truncate(10)

    #从开头开始算,将文件只保留从0-10个字节的内容,文件必须以写方式打开,但是w和w+除外;

    7、read(3)表示从文件中读取3个字节,其余的文件内光标移动都是以字节为单位,比如seek,tell,read,truncate

    8、"告白气球"文件内容:

    塞纳河畔 左岸的咖啡

    我手一杯 品尝你的美

    9、日志文件内容:

    2019/8/18 lc 今天天气真好

    2019/8/19 lc 今天天气真好

    2019/8/20 lc 今天天气不好











  • 相关阅读:
    2020.06.09 手写数字识别-小数据集
    2020.6.1 深度学习-卷积
    2020.05.22 垃圾邮件分类2
    2020.05.08 分类与监督学习,朴素贝叶斯分类算法
    2020.04.27 主成分分析
    2020.04.27 特征选择
    2020.04.26 逻辑回归实践
    2020.04.24 逻辑归回
    2020.04.21 线性回归算法
    15 手写数字识别-小数据集
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/12317205.html
Copyright © 2020-2023  润新知