13 - 文件操作

一.文本文件和二进制文件

  • 文本文件:广义上讲文本文件属于二进制文件,但是狭义上讲,就是那种我们能看得懂的文字符号组成的文件
    • 如:txt等类型文件
  • 二进制文件:内容为二进制0,1组成
    • 如:图片,视频,文本,音乐等类型文件

二.读与写的理解

  • 区分读与写需要指明参照对象

    比如:

    • pycharm 将文件内容读入到pycharm中

    • pycharm 将某内容写出到文件中

    • 文件上传:将电影读入到网盘中,然后网盘将电影写出到网盘的服务器中

    • 文件下载:互联网将网盘中的内容读入,再通过互联网将内容写出到对方的电脑中

  • 针对纯文本文件最方便使用 r,w (也可以使用rb,wb)

  • 针对二进制文件使用 rb,wb

三.文件的打开与关闭

  • 打开文件:open(文件路径,访问模式),返回值为stream对象

    f = open(r'E:\test.txt', 'w')
    

    如果不想在字符串中使用转义字符,可路径字符串前加 r

    注意:open中的文件路径只能最终定位到文件,不能是文件夹


    文件路径的说明:

    文件的路径分为相对路径和绝对路径两种。

    • 绝对路径:指的是绝对位置,完整地描述了目标的所在地,所有目录层级关系是一目了然的。
      • 例如:C:/Users/chris/AppData/Local/Programs/Python/Python37/python.exe,从电脑的盘符开始,表示的就是一个绝对路径。
    • 相对路径:是从当前文件所在的文件夹开始的路径。
      • test.txt,是在当前文件夹查找 test.txt 文件
      • ./test.txt,也是在当前文件夹里查找test.txt文件, ./ 表示的是当前文件夹。
      • ../test.txt,从当前文件夹的上一级文件夹里查找 test.txt 文件。 ../ 表示的是上一级文件夹
      • demo/test.txt,在当前文件夹里查找 demo(同级)这个文件夹,并在这个文件夹里查找 test.txt文件。

    访问模式的说明:

    访问模式 说明
    r 以只读方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,则报错。这是默认模式。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab+ 以二进制格式打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
    rt python在读取文本时会自动把\r\n转换成\n,文本文件用二进制读取用‘rt’;
  • 关闭文件:close( )

    # 新建一个文件,文件名为:test.txt
    f = open('test.txt', 'w')
    
    # 关闭这个文件
    f.close()
    

四.文件的读写操作

  • 对打开文件返回的流对象进行读写操作,即要先open指定对象和权限,再进行读写操作

读文件方法总结

  • read():无参表示读取所有内容,有参数num表示要从文件中读取的数据的长度(单位是字节)

    stream = open(r'E:\aa.txt','r')
    file = stream.read()
    print(file)
    stream.close()
    

    读文件时报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 8: illegal multibyte sequence

    解决办法1:使用rb的访问模式读文件。但是显示的形式为十六进制

    解决办法2:指定使用的字符集open('article.txt','r',encoding='UTF-8')。正常显示

  • readline():每次读取一行内容

    stream = open(r'E:\aa.txt', 'r')
    while True:
        file2 = stream.readline()
        print(file2)
        if not file2:
            break
    stream.close()
    
  • readlines():读取所有的行保存到列表

    stream = open(r'E:\aa.txt','r')
    file = stream.readlines()
    print(file)  # ['第一句话\n', '第二句话\n', '第三句话']
    for i in file:
    	print(i)  #注意格式问题:readlines读取一行的内容,一行结束会有\n符号,而print打印后也有换行符,所以就相当于打印一行再空一行再打印一行
    stream.close()
    

    image-20211012153136533

  • readable():判断是否可读

注意:对一个流对象只能做一次读操作,不能说read()后又做一次readline()

写文件方法总结

  • write(内容):如果权限为'w',每次都会将原来的内容清空,然后写当前的内容;如果为'a',则会追加

  • writelines(可迭代的内容):没有换行的效果,想换行需要自己去加

    stream = open(r'E:\aa.txt','w')
    #stream = open(r'E:\aa.txt','a')
    file = stream.writelines(['第一句话','第二句话','第三句话'])  #第一句话第二句话第三句话
    
    file = stream.writelines(['第一句话\n','第二句话\n','第三句话'])  #有换行了
    stream.close()
    

with关键字的使用

  • 当离开 with 代码块的时候,系统会自动调用 f.close() 方法,不用手动的去关闭了

    #文件的复制
    import os
    
    with open(r'e:\aa.txt','r') as rstream:
        s = rstream.read()
        path = os.path.dirname(__file__)       #__file__表示当前属性,得到当前文件所在路径,但是定位到的是文件夹,不能作为open的参数;只能是文件。
        print(path)
        result = os.path.join(path,'aa.txt')    #调用os模块下的path下的join方法得到一个文件路径
        with open(result,'w') as wstream:
            wstream.write(s)
    print('复制成功')
    

os是python系统自带的模块,有点类似于java的包,os模块下的path,是对操作系统的路径的一些操作,比如dirname,join都是一些方法,下面具体讲讲常用的os模块下的方法

五.os模块下的常用方法

os下的常用方法

  • os.getcwd():获取当前文件的工作目录
  • listdir():返回指定目录下的所有文件和文件夹,保存到列表
  • mkdir():在给定路径下创建文件夹
  • rmdir():只能删除空的文件夹
  • remove():删除文件
  • chdir(path):进入指定文件夹,类似于cd
#删除指定目录--先删除目录下的内容,再删除目录
import os
path = r'E:\p3'

filelist = os.listdir(path) #将path路径下的内容返回到列表中  ['aa.txt', 'bb.txt', 'dd.docx']
print(filelist)

for file in filelist:
    path1 = os.path.join(path,file)  #拼接一下返回该文件的绝对路径
    os.remove(path1)
else:
    os.rmdir(path)
print('删除成功')

os.path下的常用方法

  • dirname():获取指定文件的工作目录,与dirname(__file__)连用表示获取当前文件的所在目录

  • join():在前面的路径上去拼接子路径或者文件

    result = os.path.join(os.getcwd(),'file1','a.png')  #可以有多个
    #返回结果:E:\PythonLearn\PycharmProjects\pythonProject\day01\file1\a.png
    #...\day01是当前py文件的工作路径,然后拼接子文件夹,最后一个参数为文件
    
  • split():可以得到文件的文件名,分割成(文件目录,文件名)

    result = os.path.join(os.getcwd(),'file1','a.png')
    result1 = os.path.split(result)   #只要随便填一个绝对路径就行
    print(result1)
    #('E:\\PythonLearn\\PycharmProjects\\pythonProject\\day01\\file1', 'a.png') 结果为元组,进行元组相关操作即可得到文件名
    
  • splitext():可以得到文件的拓展名,分割成(文件目录\文件名,文件的扩展名)

    result2 = os.path.splitext(result)
    print(result2)
    #('E:\\PythonLearn\\PycharmProjects\\pythonProject\\day01\\file1\\a', '.png')
    
  • getsize():得到文件的大小 (字节为单位)

  • isabs():判断是一个绝对路劲吗

  • isfile():判断是一个文件吗

  • isdir():判断是一个文件夹吗

  • exists():判断给定的路径或文件夹是否存在

posted @ 2021-10-14 19:15  深藏Bluee  阅读(194)  评论(0)    收藏  举报