zoukankan      html  css  js  c++  java
  • 文件操作

    文件操作

    返回首页

      文件操作的内容:1、打开文件open   2、读操作read   3、写操作write   4、追加操作   5、关闭文件close

      第一步:打开文件,得到文件句柄并赋值给一个变量。

      第二步:通过句柄对文件进行操作。

      第三步:关闭文件。

      现有文件如下:test.txt

    据央视新闻消息
    香港特区政府发言人今日(7月3日)宣布
    根据《中华人民共和国香港特别行政区维护国家安全法》(《港区国安法》)第十二条
    香港特别行政区成立维护国家安全委员会(港区国安委)
    行政长官林郑月娥亦同时按《港区国安法》第十六条第二款任命刘赐蕙女士为警务处副处长(国家安全)
    担任警务处维护国家安全部门的负责人
    刘赐蕙于今日宣誓就任
    香港特区国安委由行政长官林郑月娥担任主席

      操作如下:

      read()操作:read的读取是从光标的位子读起。

      read()操作是将获取到文件内全部内容。

    f = open("test.txt")  #打开文件
    data = f.read()       #获取文件内容
    f.close()             #关闭文件

      read()是可以加参数的,参数是数字,可以限定读取文件内容的字符数。比如读取100个字符。

    f = open('test.txt')
    data = f.read(15)  #参数数字是指定读取的字符个数。
    print(data)
    f.close()

      readline()操作:是将获取到文件内的指定行数的内容。

    f = open('test.txt')
    data = f.readline()  #readline是按行取文件的内容,而不是按这字符。
    print(data)
    f.close()

      readlines( ) 操作是读取文件的全部行,但是要以列表的结果呈现。

      readable( ) 是判断文件是不是可读文件。返回布尔值,可读返回True,不可读,返回False。

    f = open('test.txt')
    data = f.readable()  #readable 是判断文件是不是可读文件。返回布尔值。
    print(data)
    f.close()

      write()操作:write的写入是从光标所在的位置开始添加。write()操作下,当定义成mode = “w” 那么就不能读操作。

      在定义write的时候,如果没有test这个文件,那么在open的时候,会自行创建一个test文件,以便文件的写入。

      write()操作,是覆盖写操作,当test.txt文件中有原始数据的情况下,直接write操作,是会直接覆盖的,并且答应的结果是字符个数。

    f = open('test.txt',mode='w')
    data = f.write('---- hello 
    world!')
    print(data)
    f.close()

      mode = x模式:x模式和w模式是基本一致的,都是写的模式。

      但是区别在于当写入的文件没有,则会和w模式一样创建文件,当写入的文件存在,那么w模式是覆盖写入,而x模式不会覆盖写入,而是会报错。  

      mode = a模式:在write的模式中,不单单有 “w” 模式,还有 “a” 模式。a模式就是追加模式。

       在追加模式中,它不会覆盖原文件数据,而是再光标所在位置追加写入。

       a的追加操作可以理解为像Linux的日志操作。

    f = open('test.txt',mode='a')
    data2 = f.write('
    ---- hello
    world!你发')
    print(data2)
    f.close()

      

      flush()操作:flush用于刷新操作

      flush的作用:将内存的数据,立刻存入到硬盘中。

      文件的数据读写操作,是将一段数据从内存转入到硬盘中的操作。但数据实际的操作是在内存转入缓存,再由缓存转入硬盘。

      在一个文件被open开始,无论是read读,还是write写,都没有将结果存到硬盘,而是当执行close时或文件关闭结束时,才存入磁盘。

    f = open("flush.txt",mode="w",encoding="utf8")
    data = f.write("it is test flush111")
    f.flush()      #没有flush方法,那么就要10秒回后data才会被写入文件。有了flush,data会立刻被写入到文件。
    import time
    time.sleep(10)
    f.close()

      r+操作:可读可写

    f = open('test.txt',mode='r+',encoding='utf-8')
    data = f.read()
    print(data)
    
    data2 = f.write("george
    ")
    print(data2)
    f.close()

      在r+操作中,写的操作是追加写的。并不会应为write操作而覆盖掉原有数据。

      在r+中,read是可以显示内容的,write也会返回写入的字符数。

      w+操作:可读可写

    f = open('test.txt',mode='w+',encoding='utf-8')
    data = f.read()
    data1 = f.write('New DataBase')
    print("第一次read,被覆盖源数据,没结果",data)
    print("第一次write操作,写入新数据,写入的字符个数:",data1)
    # seek,可以指定光标的位置。 seek是按字节移动的。
    f.seek(0)   # 将光标移到开始位置。
    f.seek(7)   # 将光标移到7的位置。
    print("打印光标所在位置:",f.tell())   #打印光标所在位置
    data2 = f.read()
    print("第二次read,seek调整光标位置后,可以读出结果,如不调光标,则光标在最后,依旧是没有结果的",data2)

      在w+中,read是不会显示内容的,因为在w+中,read读之前是先写的,并且还是覆盖写。

      所以即使open文件里有源数据,在read后也是空的,因为w先覆盖了。之后在write写入,就是新的数据。

      在write写入后,再read,文件内容不会别覆盖,但是read的结果依旧不会打印。

      w+如果要读,就一定要seek,才可以read。

      a+操作:可读可写

    f = open('test.txt','a+')
    f.seek(0) #将光标移动起始位
    data = f.read()
    print(data)
    f.seek(2) #在a+模型下,就算将光标移动起始位追加写入,写入的数据也是在文件末端追加写入的。
    data2 = f.write('
    George Wagn OK')
    print(data2)
    print(data)

        在a+中,是追加形式的可读可写。他的read也是不会有返回结果的。因为a的read是将光标移到最后,所以read不出结果。

      而他的write是在最后面追加写入。即使是seek将光标移到起始位,也依旧会在文件末端追加写入新的数据。

      

      seek的应用:比如断点续传。 

      断点续传,就是上传。比如本地有个视频,需要上传到另外一台PC端,上传视频操作就好比是打开一个文件,创建一个文件句柄f,read到所有的数据,然后传给另外的那一台PC端就好了。

      但是在传输中,可能出现很多情况,导致传输中断。比如在传输到25%的时候,传输中断,那么在本地的文件数据是完整的,但是在另一台的PC端中,数据就不是完整的了。这时候在恢复传输,那么传输的比例是接着那25%的继续传输。

      而seek的功能,就是在第二次续传中,对文件的内容的光标位置进行调整。

      具体操作就是将光标移动到上一次光标传输断开的位置。这个位置的判断就需要依据另一台PC端文件的内容做对比。将文件内容转换成字节数,这个字节数就是上次传输断开的位置。然后在本地的传输中,设置seek的位置参数为这个字节数,之后在执行read读操作,就可以继续续传了。

      在另一台PC中,接收也是通用的道理,在不完整的文件中,获取这个字节数,设置seek这个字节数,继续接收即可。

      

      b模式:有rb,wb,ab。 

        r w a 都是基于字符的。 而b是基于字节的。

        rb模式:可读不能写。

      wb模式:可写(覆盖写)不能读。

      ab模式:可写(追加写)不能读

          rb 是不用encoding的,不用去编解码。因为b就已经自字节了。

    f = open('test.txt','ab')   #rb 反而不用encoding了,不用去编解码。因为b就已经自字节了
    data = f.read()
    print(data)   #打印的结果是b 字节的类型

      wb 在写的时候,要指定编码。

    f = open('test.txt','wb')   
    ##wb在写的时候,要指定编码
    data = f.write('
    helel王'.encode('utf-8'))
    print(data)
    f.close()

      ab  在写的时候,和wb模式一样,要指定编码

    f = open('test.txt','ab')
    data = f.write('
    helel什么'.encode('utf-8'))
    print(data)
    data2 = f.write('
    helel什么是什么'.encode('utf-8'))
    print(data2)
    f.close()

      with

      with是简化文件操作的过程,比如正常的文件操作要open,再操作,在close,但是往往会忘记close。所以with的作用就是可以不用写close。

      with写法:with 加关键字open, open要打开问文件,之后as f,f是文件句柄。

      例如:

    with open("test.txt") as f:  #这里的f就等同于 f=open("test.txt")
        data = f.read()  #这里对f进行操作,当不需要操作时,退出这个with代码块就可以了
        print(data)

      

    ==========================

    功能实现:   

      在指定的行数添加新数据。在第四行末端加“此处有掌声”。  

    f = open('test.txt')
    data = f.readlines()  #readline是按行取文件的内容,而不是按这字符或字节。
    
    count = 0
    for line in data:
        if count == 3:
            line = ''.join([line.strip(),'此处有掌声'])   #字符串拼接,在第4行,末端加“此处有掌声”。
        print(line.strip())
        count+=1

      进度条:显示百分比。

      进度条用在文件上传下载,登录等显示进度的地方。

    import sys,time
    
    for i in range(101):
        s = '
    %d%% %s'%(i,'#'*i)
        sys.stdout.write(s)
        sys.stdout.flush()
        time.sleep(0.5)

      with的使用:对文件进行增删改查操作。 

     1 global
     2         log 127.0.0.1 local2
     3         daemon
     4         maxconn 256
     5         log 127.0.0.1 local2 info
     6 defaults
     7         log global
     8         mode http
     9         timeout connect 5000ms
    10         timeout client 50000ms
    11         timeout server 50000ms
    12         option  dontlognull
    13 
    14 listen stats :8888
    15         stats enable
    16         stats uri       /admin
    17         stats auth      admin:1234
    18 
    19 frontend oldboy.org
    20         bind 0.0.0.0:80
    21         option httplog
    22         option httpclose
    23         option  forwardfor
    24         log global
    25         acl www hdr_reg(host) -i www.oldboy.org
    26         use_backend www.oldboy.org if www
    27 
    28 backend www.oldboy1.org
    29         server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333
    30         server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000
    31         server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000
    32 backend www.oldboy2.org
    33         server 3.3.3.3 3.3.3.3 weight 20 maxconn 3000
    34 backend www.oldboy20.org
    35         server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333
    haproxy.conf

        查询需求:当用户输入oldboy用户信息后,打印对应的Server信息。

    while True:
        messages = input("please input url:").strip() #引导用户输入一个搜索信息。
        l = []
        flag = False #标志位
    
        with open("haproxy.conf",encoding="utf8") as f_read: #打开文件,获取全文f_read句柄。
            for line in f_read:  #循环f_read句柄,拿取每一行line。将匹配到的内容放到空列表l中。
                if line.startswith("backend") and messages in line: #关键字backend和messages的url在line中,则满足条件。
                    flag = True #标志位为开
                    continue #判断满足视为结束本次循环,进入下一次for循环,开始循环backend下一行真正要的数据。
                if line.startswith("backend") and flag: #将不知道改为False,就可以退出本次for循环了。
                    break
                if flag:
                    l.append(line)
            for i in l:
                print(i)

      修改文件操作:

       文件本身是不能修改的,但是可以创建一个新的文件,将内容重新写入新的文件。

       在test.txt文件的第四行加 “此处有掌声”。

    import os
    with open("test.txt",encoding="utf8") as f_read,open("new_test.txt",encoding="utf8",mode="w") as f_write: #打开两个文件
        count=0
        for line in f_read:
            if count==3:
                line="".join([line.strip(),"此处有掌声
    "])  #是四行,写入“此处有掌声”
            f_write.write(line)  #不是第四行,直接写入到new_test
            count+=1
    os.rename("test.txt", "test_bak.txt")  #rename 是修改文件名, 原文件名 修改的文件名
    os.rename("new_test.txt","test.txt")

    ---------------- END ---------------

  • 相关阅读:
    Qt 学习之路:元素布局
    Qt 学习之路 2(80):定位器
    Qt 学习之路 2(79):QML 组件
    Qt 学习之路:QML 组件
    Qt 学习之路:QML 基本元素
    qt 学习之路 :QML 语法
    Qt 学习之路:QML 和 QtQuick 2
    Qt 学习之路:线程总结
    Qt 学习之路:线程和 QObject
    五步教你实现使用Nginx+uWSGI+Django方法部署Django程序
  • 原文地址:https://www.cnblogs.com/george92/p/12990716.html
Copyright © 2011-2022 走看看