• 文件处理


    文件基本操作

    1 什么是文件?

        文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位

        文件的操作核心就:读、写

        即我们只需要对于进行读写操作,就是对操作系统发起请求,然后由操作系统将用户或者应用程序

        对文件的读写操作转换成具体的硬盘指令(比如控制盘片转动,控制机械手臂移动来读写数据)

    2 为什么要有文件?

        因为内存无法永久保存数据,但凡我们想要永久保存数据都需要保存到硬盘中,

        而操作文件就可以实现对硬件的操作

    3 如何用文件

     name='egon'

     pwd='123'

     把内存中的数据存储到硬盘中去

     l=[1,2,3]

     l.append(4)

     l.append(5)

     print(l)

     把硬盘中的数据读到内存中

    rawstring

    f=open(r'E:SH_fullstack_s2day08a.txt',mode='r') # 向操作系统发起请求,要求操作系统打开文件,占用操作系统的资源

     f1=10

     f2='aaaa'

     f2.index()

     print(f)

     y=2

    data=f.read() # 向操作系统打开发起读请求,会被操作系统转成具体的硬盘操作,将内容由硬盘读入内存

    print(data)

     del f

    f.close() #向操作系统发起请求,要求操作系统关闭文件,回收系统资源

     print(f)

     f.read()

     总结:

    1、打开文件

    2、读写

    3、关闭

    绝对路径与相对路径

    1、绝对路径:从盘符(C:\ E:\ D:\)开始写一个完整的路径
    2、相对路径:相对于当前执行文件所在的文件夹开始找
    f=open(r'aa.txt')

    # 控制读写文件内容的结果有两种:t模式text,b模型bytes
    #注意:
    #1、t与b这两种模式均不能单独使用,都需要与r/w/a之一连用
    #2、默认的内容格式是t
    #3、只有文本文件才能用t模式,也只有文本文件才有字符编码的概念

    文件打开方模式

     操作文件的基础模式有三种:
    1、r,默认的
    2、w
    3、a


    r:read,只读模式
    1、只能读,不能写
    2、在文件不存在时,会报错,在文件存在的时候会将文件指针移动到开头
     f=open(r'b.txt',mode='rt',encoding='utf-8')
     data1=f.read()
     print('第一次:',data1)
     print(type(data1))

     data2=f.read()
     print('第二次:',data2)
     f.close()

     f=open(r'b.txt',mode='rt',encoding='utf-8')
     data2=f.read()
     print('第二次:',data2)
     f.close()

     f=open(r'b.txt',mode='rt',encoding='utf-8')
     print(f.readable())
     print(f.readline(),end='')
     print(f.readline(),end='')

     lines=f.readlines()
    print(lines)
     f.close()

    w:只写模式
    1、只能写,不能读
    2、在文件不存在时会创建空文件,在文件存在的时候会将文件内容清空
     f=open(r'c.txt',mode='wt',encoding='utf-8')
     print(f.readable())
     f.read()
     f.write('你好啊我的天 你好啊我的地 啊啊啊啊啊啊 ')
     f.write('4444 ')
     f.write('5555')

     lines=['1111 ','2222 ','33333 ']
     for line in lines:
     f.write(line)
     f.writelines(lines)

     f.close()


    a:只追加写模式
    1、只能写,不能读
    2、在文件不存在时会创建空文件,在文件存在的时候会将指针移动到文件末尾

     f=open('d.txt',mode='at',encoding='utf-8')
     print(f.readable())
     f.read()

     f.write('555555 6666 ')
     f.writelines(['77777 ','8888888 ','999999999 '])

     f.close()

    b:二进制模式
    注意:
    1、一定不能指定字符编码,只有t模式才与字符编码有关
    2、b是二进制模式,是一种通用的文件读取模式,因为所有的文件在硬盘中都是以二进制形式存放的

     f=open('egon.jpg','rb')
     data=f.read()
     print(type(data))
     f.close()

     f=open('oldsiji.mp4','rb')
     data=f.read()
     f.close()

     f=open(r'F:oldsiji.mp4','wb')
     f.write(data)
     f.close()


     循环读
     f=open('d.txt','rt',encoding='utf-8')
     for line in f:
     print(line)
     f.close()

     f=open('d.txt','rb')
     for line in f:
     print(line)
     f.close()

     f=open('oldsiji.mp4','rb')
     for line in f:
     print(line)
     f.close()


     f=open('e.txt','wb')
     f.write('你好啊'.encode('utf-8'))

     f.close()


     f=open('e.txt','ab')
     f.write('大家好,我是egon'.encode('utf-8'))
     f.close()


     上下文管理
     with open('e.txt','rb') as f,open('j.txt','wt',encoding='utf-8') as f1:
    文件的操作
     src_data=f.read()
     res=src_data.decode('utf-8')
     print(res,type(res))
     f1.write(res)

    with open('e.txt','rb') as f,
    open('j.txt','wb') as f1:
    文件的操作
    f1.write(f.read())

     可读可写

    r+t:可读、可写

    w+t:可写、可读

     with open('b.txt','w+t',encoding='utf-8') as f:

         print(f.readable())

         print(f.writable())

    a+t:可追加写、可读

    r+b

    w+b

    a+b

     with open('b.txt',mode='rb') as f:

         data=f.read()

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

     with open('b.txt',mode='rt',encoding='utf-8') as f:#     data=f.read()

         print(data)

    with open('a.txt',mode='r+',encoding='utf-8') as f:

        print(f.readline())

        print(f.readline())

        f.write('小红帽')

    控制文件指针移动

     f.seek(offset,whence)

    offset代表文件的指针的偏移量,单位是字节bytes

    whence代表参考物,有三个取值

    0:参照文件的开头

    1:参照当前文件指针所在位置

    2: 参照文件末尾

    ps:快速移动到文件末尾f.seek(0,2)

    强调:其中whence=1和whence=2只能在b模式下使用

     f=open('c.txt',mode='rt',encoding='utf-8')

     f.seek(9,0)

     print(f.tell()) # 每次统计都是从文件开头到当前指针所在位置

     print(f.readline())

     f.close()

     f=open('c.txt',mode='rb')

     f.readline()

     f.seek(6,1)

     print(f.readline().decode('utf-8'))

     print(f.tell())

     f.close()

     f=open('c.txt',mode='rb')

     f.seek(-9,2)

     print(f.readline().decode('utf-8'))

     print(f.tell())

     f.close()

     了解(**)

     只有在t模式下的read(n),n代表的是字符个数,除此之外其他但凡涉及文件指针的移动都是以字节为单位的

     f=open('c.txt',mode='rt',encoding='utf-')

     print(f.read(3))

     f.close()

     f=open('c.txt',mode='rb',)

     print(f.read(3).decode('utf-8'))

     f.close()

     ab a+b r+b

    f=open('b.txt',mode='at',)

    f.truncate(9) # 参照物永远是文件开头

    f.close()

     文件修改

     with open('c.txt','r+t',encoding='utf-8') as f:

         f.seek(21,0)

         f.write('[我擦勒]')

    修改文件内容的方式一:

    思路:先将原文件内容一次性全部读入内存,然后在内存修改完毕后,再

    覆盖写回原文件

    优点:在修改期间,文件内容只有一份

    缺点:当文件过大的情况下或占用过多的内存空间

     with open('d.txt','rt',encoding='utf-8') as read_f:

         msg=read_f.read()

         msg=msg.replace('alex','xiang')

          print(msg)

     with open('d.txt','wt',encoding='utf-8') as write_f:

         write_f.write(msg)

    修改文件内容的方式二:

    思路:

    1、以读的方式打开原文件,以写的方式打开一个新文件

    2、从原文件中循环读取每一行内容修改后写入新文件

    3、删除原文件,将新文件重命名为原文件的名字

    优点:同一时刻只有一行内容存在于内存中

    缺点:在修改期间,文件内容始终存在两份,但修改完毕后会只留一份

    import os

    with open('d.txt','rt',encoding='utf-8') as read_f,

            open('d.txt.swap','wt',encoding='utf-8') as write_f:

        for line in read_f:

            write_f.write(line.replace('xiang','ALEXSB'))

    os.remove('d.txt') # 删除老文件

    os.rename('d.txt.swap','d.txt')

  • 相关阅读:
    初学Java——数组
    Ubuntu下将软件添加到快捷启动栏的问题
    初学Java——方法
    初学Java——选择
    初学Java——常用类之Math笔记
    初学Java——基本程序设计笔记(2)
    初学Java——基本程序设计笔记(1)
    关于IE浏览器里修改元素style属性的问题
    2.22,2.24工作进度
    2.21工作进度
  • 原文地址:https://www.cnblogs.com/wanglecn/p/9142276.html
Copyright © 2020-2023  润新知