• Python学习:7.文件操作


    文件操作

    我们曾将听过一个问题,将大象放入冰箱分为三步:1、打开冰箱门,2、将大象放进去,3、关上冰箱门。今天我们要讲的Python文件操作的步骤就像将大象放入冰箱的步骤一样。

    使用Python操作文件的基本步骤:

    • 打开文件
    • 对文件内容进行操作(读取文件信息,向文件中写入信息等)
    • 关闭文件

    一、打开文件

    在上一篇的内置函数介绍中,我们提到了open这个函数,这个函数的作用就是打开一个文件。

    格式一

    文件句柄 = open(文件路径,打开格式,编码)

    打开文件时,需要指定文件路径和以何种方式打开文件,打开后,即可获取该文件句柄,如后通过此文件句柄对该文件操作。

    f = open("c:/asd.txt","r",encode='utf-8')    #打开c盘下的asd.txt文件
    date = f.read()    #读取文件内容
    f.close()    #关闭文件
    print(date)    #输出文件内容

    格式二

    with open(文件路径,打开格式,编码),使用这个打开文件不用再最后使用close()关闭文件,因为使用这个with自动进行文件关闭,但是这个需要你文件的操作都在代码块中,注意缩进。

    with open("c:/asd.txt",encoding='utf-8') as f:
        data = f.read()
    
    print(data)

    代开文件的各种格式

    打开文件时,需要指定文件路径和以何种方式打开文件,打开后,即可获取该文件
    句柄,如后通过此文件句柄对该文件操作。
    打开的模式有:

    r,只读文件,【默认】
    w,只写文件,【不可读,不存在创建;存在则清空内容】
    x,只写文件,【不可读,不存在创建,存在则报错】
    a,追加模式,【不可读,不存在创建,存在则只追加内容】

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

    r+,读写【可读,可写】
    w+,写读【可读,可写】
    x+,写读【可读,可写】
    a+,写读【可读,可写】

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

    rb或r+b
    wb或w+b
    xb或w+b
    ab或a+b

    以b方式打开时,读取到的内容是字节类型,写入时也需要写入的是字节类型。

    二、对文件内容进行操作

    使用一般格式打开文件

    1、使用只读格式打开文件的时候,进行文件写入就会报错。

    2、使用写入格式代开文件的时候,会清除原有内容,然后重新写入内容。

    f = open("asd","w")#清空原有文件内容
    f.write("asd")#重新写入
    f.close()

    3、使用只写模式打开文件,没有文件就创建,有文件的时候就报错。

    然后我们再次使用上一条命令,就会发生报错,因为文件存在了。

    4、追加模式打开文件,当文件不存在的时候创建文件,当文件存在的时候在文件结尾追加内容。

    f = open("asd","a")#不存在创建,存在追加
    f.write("asd")
    f.close()

    使用字节格式打开文件

    1、只读格式

    f = open("asd","rb")#在这里打开时是以字节方式读,所以不需要加encoding="utf-8"
    data = f.read()  
    f.close()
    print(type(data))
    
    输出结果:
    <class 'bytes'>

    2、只写格式

    f = open("asd","wb")
    data = f.write(bytes("中国",encoding = "utf-8"))
    f.close()    #用字节方式写入时,需要把字符串转换为字节

    两种打开方式的内部编码机制

    普通格式

      python内部将010101自动转换为字符串(因为在本质上在在硬盘里存的就是0101,所以在读取数据时也是0101,而普通打开时,会自动将字节转换为字符串默认使用utf-8编而在转字符串是我们可以指定什么编码格式转成字符串)。

    010101======>python解释器(转换为字符串)=====>程序员看到

    字节格式

      用字节方式打开时字节直接给到程序员,没有编译过程,所以不能添加encoding =""在你写入是,如果你写入的是字符串,你需要吧字符串转换为010101,不然会报错因为字节方式打开没有编译过程,存储时也不会自动编译成0101所以需要自己吧字符串转换为字节f.write(bytes("中国",encoding = "utf-8")),才能保存。

    010101======>程序员看到

    示例

    使用字节格式读取文件,文件里原来存储的是"中国"。

    f = open("asd","rb")
    data = f.read()
    f.close()
    print(data)
    data1 = str(data,encoding = "utf-8")
    #如果是用python存储的就是utf-8,如果是自己在记事本写的可能需要用gbk
    print(data1)
    
    
    输出结果:
    b'xe4xb8xadxe5x9bxbd'
    中国

    使用字节格式写入文件,文件中存储的还是"中国"。

    f = open("asd","wb")
    str_a = "中国"
    bytes_a = bytes(str_a,encoding="utf-8")
    f.write(bytes_a)
    print(bytes_a)
    f.close()
    
    
    输出结果:
    b'xe4xb8xadxe5x9bxbd'

    使用一般格式输入输出的都是字符串,使用字节格式输入输出的都是字节,在我们使用的时候一般不使用字节格式进行文件读写。

    有关读写文件内部指针问题

    f = open("world.txt", "r+",encoding='utf-8')
    data = f.read()
    print(type(data), data)
    
    f.write("地球村")
    a = f.read()
    print(type(a), a)
    # 在这里输出的是空的,在读写时有一个指针,你读一个,指针就向后移一个,追加一个字符就再向后移一个,等你再次输出是,指针就指向空的地方,所以输出是空的
    print(f.tell())#输出指针位置,字节,一个汉字三个字节
    f.close()
    
    
    输出结果:
    <class 'str'> 地球
    <class 'str'> 
    9

    相关示例:

    文件原内容:alexsel

    f = open("name.txt", "r+")
    data = f.read(3)
    print(type(data), data)
    print(f.tell())     #输出当前指针位置
    f.write("地球村")
    print(f.tell())
    a = f.read()    
    print(type(a), a)
    print(f.tell())
    f.close()
    
    
    输出结果:
    <class 'str'> ale
    3
    13
    <class 'str'> xsel
    13

    我们指针之前的字符进行读取怎么办,我们可以使用seek()调整指针位置。

    f = open("name.txt","w+",encoding="utf-8")
    f.write("三顾茅庐")
    f.seek(0) #这个可以将指针移动到最开始(0),不移动,在输出是就的是空的
    data = f.read()
    f.close()
    print(data)
    
    
    输出结果:
    三顾茅庐

    使用追加模式打开文件的时候,文件指针直接在最后。

    f = open("asda.log","a+",encoding="utf-8")
    print(f.tell()) #使用追加的时候,打开文件的时候,指针直接在最后
    data = f.read() 
    print(data) #指针直接在最后,所以这里输出为空
    f.seek(0)
    data = f.read()
    print(data)
    f.close()
    
    
    输出结果:
    7
    
    alexsel

    三、文件关闭

    之前我们在文件操作中一直在使用,使用close()进行文件关闭,不对文件文件关闭会导致出错。

    文件操作中使用到的方法

    file为文件句柄

    file.close()
    方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

    file.write()
    向文件中写入数据

    file.fulsh() 
    刷新文件内部缓存区

    f1 = open("asda.log","r+",encoding="utf-8")
    f1.write("啊啊啊啊啊")
    f1.flush()
    f1.seek(0)
    print(f1.read())
    
    输出结果:
    啊啊啊啊啊
    
    

    当文件还没有关闭时,这些东西就还没有存到硬盘里,只是在内存里就像你在记事本输入了一串字符但是没有保存一样,只是在内存里,flush()功能就是把写入的字符进行存储,就像记事本里的保存一样,把内存的内容刷新到硬盘里。

    file.name

    获取操作文件的文件名

    f = open("name.txt","r+",encoding="utf-8")
    ut = f.name
    print(ut)
    
    输出结果:
    name.txt

    file.readable()
    判断打开文件是否可读

    f1 = open("asda.log","r+",encoding="utf-8")
    pd=f1.readable()
    print(pd)
    
    
    输出结果:
    True

    file.readline()
    仅读取一行数据(自动把指针放在第一行末尾,再读时,就是从第二行开始)

    #问价内容:第一行是三顾茅庐,第二行是alexsel
    f1 = open("name.txt","r+",encoding="utf-8")
    data = f1.readline()
    print(data)
    data1 = f1.readline()
    print(data1)
    f1.close()
    
    
    输出结果:
    三顾茅庐
    
    alexsel


    file.seekable()
    指针是否可操作

    f1 = open("name.txt","r+",encoding="utf-8")
    ut = f1.seekable()
    print(ut)
    f1.close()
    
    
    输出结果:
    True

    总结:

    • 不管是读文件还是写文件,操作完成后都要调用close()来关闭文件
    • 但是调用with… as就可以省去close()了
    • 可以指定读取和写入文件编码方式,就是在对用函数中加入encoding=’xxx’
    • 我们可以使用各种方法方便我们对文件的操作
    • 读写文件是我们需要注意一下指针的位置

    今天的Python的文件操作就到这里,这里仅仅是简单的学习,以后我们做简单的项目的时候会加深练习。

  • 相关阅读:
    iOS开发-UIScrollView原理
    关于tableView点击状态栏列表回到顶部的说明
    实用技术之bugly
    KVO你所不知道的"坑"
    iOS iPhone SDK 包含哪些东西?
    NSTime的全面认识
    四 数据结构与算法总结(一)
    三 数据结构 --数和二叉树
    二 线性表
    一 数据结构的概念,时间复杂度和空间复杂度
  • 原文地址:https://www.cnblogs.com/liudi2017/p/9189363.html
Copyright © 2020-2023  润新知