zoukankan      html  css  js  c++  java
  • Python----文件的IO操作

    一、文件操作

    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

      打开文件

      假设我们有一个file.txt文件,内容为:

    abcdefg
    jijklmn
    opqtsr
    uvwxyz
    # Author:Tim Gu
    data = open('file.txt',encoding="utf-8").read()
    print(data)

    输出:

    abcdefg
    jijklmn
    opqtsr
    uvwxyz

      读文件:

    # Author:Tim Gu
    f = open('file.txt','r',encoding='utf-8')
    data = f.read()
    print(data)
    >>>
    abcdefg
    jijklmn
    opqtsr
    uvwxyz

      写文件:

    f = open('file.txt2','w',encoding='utf-8') #文件句柄,使用w时事实上是创建了一个新文件,如果源文件存在,会覆盖
    f.write("I will go home!") 
    f.write('
    ByeBye!')
    f.write('
    adfas')

     

      追加文件:

      

    f = open('file.txt2','a',encoding='utf-8') #文件句柄
    f.write("See you,tomorrow!")

      打开文件file.txt2

    I will go home!
    ByeBye!
    adfasSee you,tomorrow!

      以行读取文件:
    # Author:Tim Gu
    f = open('file.txt2','r',encoding='utf-8') #文件句柄
    print(f.readline())  #读取一行
    for i in range(2):   #使用for循环读取2行
        print(f.readline()) 

      使用readline()读取的是文件的单行,readlines()会读取文件全部行,每行作为一个元素形成一个列表。readlines()因为会一下子把文件全部读取到内存,所以只适合读小文件。

      下面示例读取文件,但不读取第10行:

    # Author:Tim Gu
    f = open('file3.txt','r',encoding='utf-8') #文件句柄
    #print(f.readlines())
    for index,line in enumerate(f.readlines()): #使用遍历读取文件
        if index == 9:
            print('------------------我是分割线-------------------')
            continue
        print(line.strip())

      输出:

    从前现在过去了再不来
    红红落叶长埋尘土内
    开始终结总是没变改
    天边的你飘泊白云外
    苦海翻起爱恨
    在世间难逃避命运
    相亲竟不可接近
    或我应该相信是缘份
    情人别后永远再不来(消散的情缘)
    ------------------我是分割线-------------------
    鲜花虽会凋谢(只愿)
    但会再开(为你)
    一生所爱隐约(守候)
    在白云外(期待)
    苦海翻起爱恨
    在世间难逃避命运
    相亲竟不可接近
    或我应该相信是缘份
    苦海翻起爱恨
    在世间难逃避命运
    相亲竟不可接近
    或我应该相信是缘份

      处理大文件的方法:这行代码的效果和上面的一样,只是使用了迭代器,使得内存可以只保留一行

    f = open('file3.txt','r',encoding='utf-8') #文件句柄
    count = 0
    for line in f: #一行行读取文件,内存中只保留一行。
        if count == 9:
            print('------------我是分割线---------------')
            count += 1
            continue
        else:
            print(line.strip())
            count += 1

      光标处理:seek()用法

    # Author:Tim Gu
    f = open('file3.txt','r',encoding='utf-8') #文件句柄
    print(f.tell()) #读取光标坐在位置
    print(f.readline()) #读取一行
    print(f.readline()) #读取第二行
    print(f.readline()) #读取第三行
    print(f.tell()) #打印光标所在位置
    f.seek(0) #使光标回到原点
    print(f.tell()) #打印光标位置
    >>>
    0
    从前现在过去了再不来
    
    红红落叶长埋尘土内
    
    开始终结总是没变改
    
    90
    0

      flush()实时将数据写入磁盘

      打印进度条的小方法: 

    # Author:Tim Gu
    import sys,time
    for i in range(20):
        sys.stdout.write("#")  #sys.stdout方法在同一行打印
        sys.stdout.flush()      #每打印一个#符号写入一次
        time.sleep(0.3)         #每打印一次隔0.3秒
    >>>
    ####################

      

      truncate() 截断文件,可以清空文件

    # Author:Tim Gu
    f = open('file.txt','a',encoding='utf-8')
    f.truncate(10)  #保留文件前10个字符,其余截断

      

      文件的模式:r+读写模式:这段代码会先读取3行,然后再在文件最后写入"-------------------------------------"

    # Author:Tim Gu
    f = open('file.txt','r+',encoding='utf-8') #读写
    print(f.readline())
    print(f.readline())
    print(f.readline())
    f.write("----------------------------------------------")
    print(f.readline())

      文件的模式:w+ 写读模式:会创建新文件,此段代码会覆盖掉源文件

    # Author:Tim Gu
    f = open('file.txt','w+',encoding='utf-8') #写读
    print(f.readline())
    print(f.readline())
    print(f.readline())
    f.write("----------------------------------------------")
    print(f.readline())


     

      tell()和seek()联合使用:

    # Author:Tim Gu
    f = open('file.txt','w+',encoding='utf-8') #写读
    f.write("-----------------------------1------------------------")
    f.write("
    -----------------------------2------------------------")
    f.write("
    -----------------------------3------------------------")
    f.write("
    -----------------------------4------------------------")
    print(f.tell()) #打印光标所在位置
    f.seek(10)   #使光标回到第十个字符的位置
    print(f.readline())   #打印当前行
    >>>
    222
    -------------------1------------------------

    此时文件内容:

    -----------------------------1------------------------
    -----------------------------2------------------------
    -----------------------------3------------------------
    -----------------------------4------------------------should be at the begining of the second line

      line.replace的用法,修改文件中的某一行内容:

    # Author:Tim Gu
    f = open('file3.txt','r',encoding='utf-8')
    f_new = open('file3.bak','w',encoding='utf-8')
    for line in f:
        if '天边的你飘泊白云外' in line:
            line = line.replace('天边的你飘泊白云外','aaaaaaaaa')  #修改这一行字符串
        f_new.write(line)
    f.close()
    f_new.close()

       使用with打开文件:

    with open('file.txt','r',encoding='utf-8') as f,
            open('file3.txt','r',encoding='utf-8') as f2:
        for line in f:
            print(line)
        for line in f2:
            print(line)

      注:因实际开发过程中,打开文件很容易忘记关闭文件,造成内存不能释放,所以一般可以选择使用with open方法打开文件

      
      python3的新特性:x

    f = open('1.txt','x',encoding='utf-8') #如果文件存在则报错,不存在则创建文件并只写

      文件之ab模式:

    f = open('1.txt','ab') #使用ab写文件
    f.write(bytes('顾卿',encoding='utf-8')) #因为有b,所以必须传字节类型,所以使用bytes把字符串转化为字节类型
    f.close()

      seek()和tell()的特性:
    模式r+一般比较常用,相比较a+,r+可控制指针位置来写,而a+则永远只能在末尾写 

    f = open('1.txt','r+',encoding='utf-8') #打开模式是r+(无b),读取按照字符读取
    data = f.read(1) 
    print(f.tell()) #tell当前指针所在的位置(字节)
    f.seek(f.tell()) #调整当前指针的位置(字节)
    f.write('888') #当前位置开始覆盖
    f.close()

      

      flush()的作用:

    f = open('1.txt','a',encoding='utf-8')
    f.write('123')
    f.flush()  #将缓存内容强制写进磁盘
    input('asdfasd')

      seekable():
    是否可以移动指针

    打开两个文件,将第一个文件的内容写进第二个文件:

      

    with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2:
        times = 0
        for line in f1:
            times += 1
            if times <= 10:
                f2.write(line)
            else:
                break
                
    读取第一个文件内容,修改后写入第二个文件:
    with open('1.txt','r',encoding='utf-8') as f1,open('2.txt','w',encoding='utf-8') as f2:
        times = 0
        for line in f1:
            new_str = line.replace('aaaaa','st')
            f2.write(new_str)
  • 相关阅读:
    结对-结对编项目作业名称-开发环境搭建过程
    课后作业-阅读任务-阅读提问-3
    团队-象棋游戏-项目进度
    结对-五子棋游戏-测试过程
    课后作业-阅读任务-阅读提问2
    201501006-构建之法:现代软件工程-阅读笔记
    结对编程-五子棋游戏-开发过程
    象棋游戏,代码规范
    结编程队-五子棋游戏-项目进度
    《个人-GIT使用方法》
  • 原文地址:https://www.cnblogs.com/guqing/p/6084009.html
Copyright © 2011-2022 走看看