• Python文件操作1--知识点


    文件介绍

    文件:数据存储的设备;持久性的存储数据内容;
    文件组成:
    文件名(同级目录下,不能有两个相同的文件名)
    扩展名(.txt,.docx,.jpg)(不同的扩展名对应不同的文件格式,不同的文件格式有着不同的存储方式,方便程序处理)
    文件内容(txt,dox等)

    文件的操作流程

    打开文件 (通过一个管道)- 读写(有的管道只可以读,有的写,有的可读可写) - 关闭文件 (拔掉管道)

    打开: open(‘文件’,‘模式’)
    —文件:指定文件路径
    – 模式:

    1. r模式:如果文件不存在会报错;以只读方式打开文件(默认模式);文件的指针将会放在文件的开头
    f = open('a.txt','r') #相对路径,当前目录下的指定文件  #f 类似我们加的管道
    content = f.read() 
    print(content) #打印原文件的全部内容--即开始时指针放在了开头
    #f.write('123456')  报错,r只能读不能写
    f.close() #关闭通道
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. w模式:只写;文件的指针放在文件的开头,写入新文件会覆盖旧内容;文件不存在时会自动创建一个文件
    f = open('b.txt','w') 
    f.write('123456')  #写入内容加在开头,且把原文件内容全部覆盖掉 #无论原内容如何,这个输出只会是123456
    #原内容abcdef  
    #content = f.read()  报错,不能读取
    f.close() #关闭通道
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. a模式:与w模式一模一样,除了文件的指针会放在文件结尾,写入内容会接在旧内容后面
    f = open('b.txt','w') 
    f.write('123456')  #写入内容加在结尾
    #原内容abcde,写入123456,输出:abcde123456  
    #content = f.read()  报错,不能读取
    f.close() #关闭通道
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 增加b模式:图片,视频,音频 都在模式后面加b,例如 rb 、wb、ab —以二进制文件来操作
      例子:
      将图片一半 写入另一个文件里去
      1,打开(xx.jpg)文件,取出内容,获取内容的前面半部分
      2,打开另外一个文件xx2.jpg,然后,把取出的半部分内容,写入xx2.jpg文件里去
    #1,打开(图.jpg)文件,取出内容,获取内容的前面半部分
    #1.1打开文件
    fromfile = open('xx.jpg','rb')  #jpg文件要用rb。因为图片是rgb数转成了二进制数据,不是文本文件
    #1.2读取文件内容
    formContent = fromfile.read()   
    #1.3关闭文件
    fromfile.close()
    
    #2,打开另外一个文件xx2.jpg,然后,把取出的半部分内容,写入xx2.jpg文件里去
    #2.1 打开目标文件
    toFile = open('xx2.jpg','wb')
    #2.2 写入操作
    content = formContent[0:len(formContent)//2]  #利用切片进行截取
    toFile.write(content)
    #1.3关闭文件
    toFile.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 增加+ 模式 : r+ w+ a+ 代表的是以‘读写模式’进行打开,特性与+前的模式一致,但是关于部分操作会有细节区别
      r+ : 可读可写,文件不存在会报错 与w不同的在于:
      原文件abcdefg 写入123
      r+模式下输出:123defg 指针也放在开头
      w模式下输出:123

    例子:

    f = open('a.txt','r+') #a文件中原内容是 abcdefg
    c = f.read()  #先读后写
    print(c)   #输出abcdefg
    f.write('8888')  #a文件内容变成了abcdefg8888
    #原因,在读后指针会变到最后!!!!所以不会产生覆盖
    
    • 1
    • 2
    • 3
    • 4
    • 5

    定位

    当前指针放的位置
    f.seek(偏移量,[0,1,2])
    f.tell() 查看当前指针位置

    f = open('b.txt','r') #原内容:abcde123456
    print(f.tell()) #打印出当前指针的位置  输出:0
    print(f.read())   #输出:abcde123456
    
    f.seek(2)  #从开头开始往后移动两个字节,同f.seek(2,0)
    #f.seek(2,1)第二个参数是1--从当前位置出发。2-从结尾位置出发,
    # 注意:选1,2 只能是在二进制文件中。类似现在这样的文本文件只能用0
    #同时:不是r模式,是rb模式下(把此文件当成二进制文件处理)可以用1,2 
    
    print(f.tell())  #输出:2
    print(f.read())  #输出:cde123456
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    读写

    f.read(字节数) – 从当前文件指针开始,读取字节数n个字节。默认读全文件

    f = open('b.txt','r') #要读不能填a与w  原内容123456789
    content = f.read(2)
    print(content)   #输出:12
    f.seek(4)
    content = f.read(2)
    print(content)   #输出:56
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    f.readline([limit]) —读取行

    f = open('b.txt','r') #原内容1 换行 2 换行 3 换行 4
    content = f.readline()
    print(content,end="") #输出1
    content = f.readline()  #读取过程中,指针在变
    print(content,end="") #输出2   一行一行的输出
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    f.readlines() —自动处理换行文件,并以列表形式输出

    f = open('b.txt','r') #原内容1 换行 2 换行 3 换行 4
    content = f.readlines()
    print(content)
    #输出:['1\n', '2\n', '3\n', '4\n', '5\n', '6']
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    遍历

    for in 可以遍历f本身与行列表

    import collections
    f = open('b.txt','r') #要读不能填a与w  原内容123456789
    print(isinstance(f,collections.Iterator)) #判断是否是迭代器
    
    # for i in f:
    #     print(i,end='')#print(i)
    content = f.readlines()
    for i in content:
        print(i,end='')
    
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    判断是否可读

    if f.readable():
    虽然没有输出,但至少不会报错,即不会影响后续的代码

    f = open('b.txt','a') #a不能读
    if f.readable():
        content = f.readlines()
        for i in content:
         print(i,end='')
    #虽然没有输出,但至少不会报错
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    读取方法的选取

    f.read(字节数)与f.readlines() 全部读取,即全部加载到内存中去了,内存占大,但是下次处理会更快,性能高
    f.readline([limit])与for in 节省内存空间,适合文件特别大的时候

    文件的写入

    f.write() --返回值:写入内容的字节长度
    print(f.write(‘abc’)) #输出3

    f = open('b.txt','a')
    
    if f.writable():#容错处理
        print(f.write('abcd')) #输出4
    
    f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    关闭

    为什么需要关闭?

    • 释放系统资源
    • 会立即清空缓冲区的数据内容到磁盘文件
      数据先到缓冲区,再到文件中去
      f.flush() --立马清空缓冲区的数据内容到磁盘文件中,不用等到f.close()再实现
    f = open('b.txt','a')
    #一步步调试
    f.write('abcd') #执行该语句后,文件还没出现abcd
    f.flush()  #该语句后,出现abcd
    f.close()  #不用f.flush()也能让文件出现abcd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    重命名

    os.rename(“old”,‘new’) #修改单极
    os.renames(“old”,‘new’) #修改多极

    import os
    os.rename("b.txt",'bb.txt')  #修改文件名b.txt ,改为bb.txt
    os.rename("aafirst",'aaone') #修改文件夹aafirst,改为aaone
    
    os.renames('aaone/one.txt','two/two.txt') #修改多级,文件夹与文件名同时被更改
    
    • 1
    • 2
    • 3
    • 4
    • 5
    删除

    删除文件: os.removw(‘文件路径’)
    删除目录:
    os.rmdir(path) 不能递归删除目录,如果文件夹非空,会报错
    os.removedirs(path) 可以递归的删除目录,如果文件夹非空会报错

    os.remove('xx2.jpg')  #删除当前目录下的xx2文件
    os.rmdir('one/one2') #删除one文件夹下的one2空文件夹
    os.removedirs('one/one2') #删除one2文件夹后,继续删除one文件夹
    
    • 1
    • 2
    • 3
    创建文件夹

    os.mkdir(‘文件夹名称’[,mode]) 不能递归创建

    import os
    os.mkdir('a')
    os.mkdir('b/c') #报错,不能创建多级目录
    os.mkdir('b',0o777) #对文件拥护者、同组用户、其他用户都开放了读、写、可执行
    
    • 1
    • 2
    • 3
    • 4

    mode数字模式权限: 三个7
    在这里插入图片描述

    其他

    os.getcwd() – 获得当前路径
    os.chdir(‘a’) – 进入当前目录下的a文件夹
    print(os.listdir(‘a’)) --列举当前目录下a文件夹里的文件
    print(os.listdir(‘./’)) — 列举当前目录下的文件名
    print(os.listdir(‘…/’)) – 列举上一级目录的文件名

  • 相关阅读:
    Spring Boot Actuator - Spring Boot 应用监控
    [附源码]SSM计算机毕业设计学生量化考核管理系统JAVA
    Docker安装portainer/安装mongodb【亲测有效】
    PreScan快速入门到精通第二十七讲PreScan中常用传感器之AIR传感器
    MySQL常规练习 .MySQL安装成功后的进入方式
    性能优化:如何高效使用虚拟DOM
    贪心算法之过河问题
    【机器学习】集成学习(以随机森林为例)
    总结:大数据服务
    软件开发工具的现状与发展
  • 原文地址:https://blog.csdn.net/Sun123234/article/details/126788484