• 文件操作及其方法


    Python中文件操作可以分为三步:

    1. 打开文件,得到文件句柄并赋值给一个变量

    2. 通过句柄对文件进行操作

    3. 关闭文件 

    打开文件模式

    打开文件的模式有:

    • r,只读模式(默认)。

    • w,只写模式。【不可读;不存在则创建;存在则删除内容;】

    • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

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

    • r+,可读写文件。【可读;可写;可追加】

    • w+,写读

    • a+,同a

     
    "U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)

    • rU

    • r+U

     
    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

    • rb

    • wb

    • ab

     
    操作文件内容如下:

    I took a pill in Ibiza
    我在Ibiza岛上嗑药
    To show Avicii I was cool
    为了让Avicii觉得我很酷
    And when I finally got sober, felt 10 years older
    当我终于清醒过来了 仿佛已经是十年之后
    But fuck it, it was something to do
    但操他妈的 那也算是消遣了
    I'm living out in LA
    我住在LA
    I drive a sports car just to prove
    我开跑车只为了证明
    I'm a real big baller cause I made a million dollars
    我真的超屌能赚百万
    And I spend it on girls and shoes
    然后我把它们全部都花在妞和鞋上
    But you don't wanna be high like me
    但你不会想和我一样拥有这么多
    Never really knowing why like me
    我都不明白为什么人想要得到这么多
    You don't ever wanna step of that roller coaster and be all alone
    (一旦你拥有过之后)你就再也不想离开这过山车 再变得独自一人
    You don't wanna ride the bus like this
    你不会想要过这样的生活
    Never knowing who to trust like this
    像这样永远不知道能信任谁
    You don't wanna be stuck up on that stage singing
    你不会想在台上自我感觉良好地唱歌 受到万人追捧
    Stuck up on that stage singing
    不想这样骄傲地在台上唱歌
    All I know are sad songs, sad songs
    我只知道 我只想唱 那些悲伤的歌
    Darling, all I know are sad songs, sad songs
    宝贝儿 我真的只知道 只想唱 那些悲伤的歌

    文件操作常用功能


    1、read()、readline()、readlines()的区别

    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen
    
    f = open('aa.txt', encoding='utf-8')
    print(f)
    
    
    # 打印出来的是一个文件句柄信息:<_io.TextIOWrapper name='aa.txt' mode='r' encoding='utf-8'>
    
    print(f.read())   # 打印出来的就是文件所有的内容,全部加载到内存,读取出来
    print(f.readline())   # 打印的是文件第一行的内容
    print(f.readlines())  # 把文件内容每行当做一个列表的元素,放到一个列表中,打印的是一个列表
    f.close()


    2、文件指针

    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen
    
    f = open('aa.txt', encoding='utf-8')
    print("第一次读取开始指针位置为%s".center(30, '*') % f.tell())
    print(f.readline().strip())   # 打印的是文件第一行的内容
    end_tell = f.tell()   # 获取当前指针位置
    print("第一次读取结束指针位置为%s".center(30, '*') % end_tell)
    
    print("第二次读取开始指针位置为%s".center(30, '*') % f.tell())
    print(f.readline().strip())
    end_tell = f.tell()  # 获取当前指针位置
    print("第二次读取结束指针位置为%s".center(30, '*') % end_tell)
    
    # 把指针调节到最开始重新重新读取
    f.seek(0)  # 把指针调节到最开头
    print("重新读取开始指针位置为%s".center(30, '*') % f.tell())
    print(f.readline().strip())
    end_tell = f.tell()
    print("重新读取结束指针位置为%s".center(30, '*') % end_tell)
    f.close()

    Result:

    ********第一次读取开始指针位置为0********
    I took a pill in Ibiza
    ********第一次读取结束指针位置为23********
    ********第二次读取开始指针位置为23********
    我在Ibiza岛上嗑药
    ********第二次读取结束指针位置为47********
    ********重新读取开始指针位置为0*********
    I took a pill in Ibiza
    ********重新读取结束指针位置为23*********


     3、encoding 显示打开文件的编码格式

    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen
    
    f = open('aa.txt')
    print(f.encoding)
    f.close()
    
    f = open('aa.txt', 'r+', encoding='gbk')
    print(f.encoding)
    f.close()

    Result:

    UTF-8
    gbk


    4、seekable  判断一个文件是否是光标可移动文件,有些二进制文件是无法进行光标移动的。

    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen
    
    f = open('aa.txt', 'r+', encoding='utf-8')
    Re = f.seekable()
    if Re:
        print("Allow Move Cursor")
    f.close()

    Result:

    Allow Move Cursor


    5、read() 如果不输入任何参数,读取整个文件,可以跟参数指定读取文件的字节数

    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen
    
    f = open('aa.txt', 'r+', encoding='utf-8')
    # 读取三个字节
    print(f.read(3))
    print("*" * 30)
    # 读取50个字节
    print(f.read(50))
    f.close()

    Result:

    I t
    ******************************
    ook a pill in Ibiza
    我在Ibiza岛上嗑药
    To show Avicii I w


    6、readable() 判断一个文件是否可读,返回布尔值

    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen
    
    f = open('aa.txt', 'r+', encoding='utf-8')
    Re = f.readable()
    
    if Re:
        print("File Allow Read!")
    else:
        print("File Not Allow Read!")
    f.close()
    
    print('分割线'.center(30, '*'))
    
    f = open('aa.txt', 'a', encoding='utf-8')
    Re = f.readable()
    
    if Re:
        print("File Allow Read!")
    else:
        print("File Not Allow Read!")
    f.close()

    Result:

    File Allow Read!
    *************分割线**************
    File Not Allow Read!

     f.writeble()和上面的一样,是用来测试文件的打开方式是否可读。


    7、flush 强制刷新到内存

    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen
    # load module
    import sys
    import time
    
    # 模拟进度条
    for i in range(61):
        sys.stdout.write('>')
        sys.stdout.flush()  # flush 强制刷新缓存到内存的数据写入硬盘
        time.sleep(0.1)


    8、with语句
    为了避免打开文件后忘记关闭,可以通过管理上下文,即:

    with open('log','r', encoding='utf-8') as f:
          
        ...

    如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

    在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

    with open('log1') as obj1, open('log2') as obj2:
        pass

    例子:比如要修改haproxy.cfg 文件然后还的回滚怎么做?

    with open('haproxy.cfg','r') as obj1,open('haproxy.cfg.new','w') as obj2:
        for i in obj1.readlines():
            i = i.strip()
            print i
            obj2.write(i)
            obj2.write('
    ')
    
    #读取harpoxy.cfg每行然后存储到新的文件haproxy.cfg.new里!


     9、文件遍历

    #!/usr/bin/env python3
    # _*_coding:utf-8_*_
    # Author: Lucky.chen
    # load module
    
    f = open("aa.txt", 'r', encoding="utf-8")
    
    for index, line in enumerate(f.readlines()):
        # 先把文件内容以行为分割生成列表,数据量大不能用
        if index == 5:
            print("我是分割线".center(50, '-'))
            continue
        print(line.strip())
    
    #  f.readlines()是把整个文件的每一行当做一个元素,存放在一个列表中,然后循环这个列表就可以了。
    # 注:此种方式存在隐患,假如一个文件过大,会把整个内存撑爆
    f.close()
    
    
    f = open("aa.txt", 'r', encoding="utf-8")
    count = 0
    for line in f:
        count += 1
        if count == 3:
            print("我是第二个分割线".center(50, '-'))
            continue
        print(line.strip())
    
    f.close()
    
    # 直接for循环后面直接跟文件句炳,此时这个文件句炳是一个迭代器,这样读取是一行一行的读取,内存只会存放一行内容,故而不会涉及内存的问题。
    
    # 两者的优缺点,第一种方法因为是列表,可以直接使用下标,对文件读取那行进行方便控制;第二种方法没有下标,只能自己写计数器,进行判断。
    是什么让你疯狂?
  • 相关阅读:
    章节八、2-火狐的插件TryXPath
    章节八、1-如何使用火狐开发者工具来查找元素
    章节七、6-Map集合的区别
    章节七、5-Maps
    章节七、4-Sets
    章节七、3-ArrayList和LinkedList对比
    章节七、2-Linked List
    jQuery中$符号的作用
    jQuery基础的HTML与text区别
    推荐一些github上的免费好书
  • 原文地址:https://www.cnblogs.com/iforelse/p/6592265.html
Copyright © 2020-2023  润新知