zoukankan      html  css  js  c++  java
  • 文件操作(open eadwriteclose)

    为了方便演示,我们建立了一个示范文本,如下所示:

    hello,我是代码螺丝钉
    test1
    test2
    test3

    文件的读


    f = open("示范文本","r")   #打开文件,获取句柄
    v1 = f.read()     #通过句柄进行读操作
    print(v1) #打印结果为nicodeDecodeError: 'gbk' codec can't decode byte,报错了
    f.close()   #关闭文件

    以上程序报错了,原因是因为示范文本这个文件的编码格式是utf-8,而open这个函数解码默认为系统的解码,我们操作系统默认为GBK编码,以下进行解决

    f = open("示范文本","r",encoding="utf-8")   #打开文件,获取句柄,设置以utf-8解码
    v1 = f.read()     #通过句柄进行读操作
    print(v1) 
    #打印结果为
    # hello,我是代码螺丝钉
    # test1
    # test2
    # test3
    f.close()   #关闭文件

    如上所示,加入encoding=“utf-8”后可以解决解码错误的问题,如果我们想要读取一行如何做呢,答案是使用readline()

    f = open("示范文本","r",encoding="utf-8")   #打开文件,获取句柄,设置以utf-8解码
    print(f.readline(),end="")  #读取一行,end =""代表忽略回车,要不然打印会多打印一行空行
    print(f.readline(),end="")
    print(f.readline(),end="")
    print(f.readline(),end="")
    print(f.readline(),end="")
    f.close()   #关闭文件
    #打印结果为
    # hello,我是代码螺丝钉
    # test1
    # test2
    # test3

    还有一个函数为readlines(),下面来演示其效果

    f = open("示范文本","r",encoding="utf-8")   #打开文件,获取句柄,设置以utf-8解码
    print(f.readlines())  #读取结果,最后存入一个列表中,每个元素代表一行
    f.close()   #关闭文件
    #打印结果为['hello,我是代码螺丝钉
    ', 'test1
    ', 'test2
    ', 'test3']

    以上发现上面代码的效果就是读取所有行,然后建立一个列表,每一行的内容作为列表的一个元素

    文件的写


    文件的写可以完全类比文件的读,以下是示例代码

    f = open("示范文本","w",encoding="utf-8")   #打开文件,获取句柄,设置以utf-8解码
    f.writelines(["1111","2222
    ,3333
    "])   #传入列表,一次写多行
    f.write("4444
    5555
    ")
    f.close()

    最后写出来的文本如下所示

    11112222
    ,3333
    4444
    5555

    文件的其他模式


    • a   追加模式,不会覆盖文件,而是写到文件最后
    • r+   可读写模式,写操作默认从文件开头开始写

    如何不用自己手动close,而让操作系统自己帮我们取关闭文件呢,答案是使用with关键字

    with open("示范文本","w",encoding="utf-8") as f:
         f.write("4444
    5555
    ")

     文件的seek操作


    我们在windows中进行文本编辑时候,有一个光标|一直闪烁,用于定位当前的文本编辑位置,对应文件操作就是seek,以下为seek函数的用法

    with open("示范文本","rb") as f:   #要使用seek的其他选项,必须要用二进制打开
         f.seek(2)   #从开头算起绝对位置的2
         print(f.tell())
         # 打印结果为2
         f.seek(3,1)  #相对于当前位置2   偏移3
         # 打印结果为5
         print(f.tell())
         f.seek(-1,2)  #从结尾12 算起后退1
         print(f.tell())
         # 打印结果为11

    文件的flush操作、truncated操作


    对于这两个操作,这里就不贴代码了,但是需要对其进行一下讲解

    flush操作的目的:平常我们使用write函数进行写,实际上是在内存中写,并没有真正写入到硬盘中,当我们关闭文件的时候才会真正写入,但是如果我们写到一半的时候就想把内存中的内容存入硬盘,就可以调用flush函数

    truncated操作本质上是写,打开一个文件,然后使用truncated函数对其进行切片操作

  • 相关阅读:
    (转载)5分钟安装Linux系统到U盘
    (原创)LAMP搭建之二:apache配置文件详解(中英文对照版)
    (原创)LAMP搭建之一:图解如何安装并检查LAMP
    OpenGL-渲染管线的流程(有图有真相)
    判断点在直线上
    使用QT开发GoogleMap瓦片显示和下载工具
    转:PCL+VS2010环境配置
    error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不匹配值“2”
    An error occurred during the installation of assembly 'Microsoft.VC90.ATL or 'Microsoft.VC80.ATL'
    如何确定VS编译器版本
  • 原文地址:https://www.cnblogs.com/codescrew/p/8698664.html
Copyright © 2011-2022 走看看