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

    文件常用IO操作——open

    # r模式
    f = open("test","r")  #只读
    f.read()
    f.write("abc")
    f.close()
    
    # w模式
    f = open("test","w")  #只写打开
    f.write("abc")
    f.close()
    • r模式
    1. 只读打开文件,若使用write方式,会抛异常
    2. 如果文件不存在,抛出异常
    • w模式
    1. 只写方式打开,如果读取则抛异常
    2. 若文件不存在,则直接创建文件
    3. 如果文件存在,清空文件内容并写入
    # x模式
    f = open("test","x")  #只写打开
    f.read()
    f.write("abc")
    f.close()
    
    # a模式
    f = open("test","x")  #只写打开
    f.read()
    f.write("abc")
    f.close()
    • x模式
    1. 文件不存在,则直接创建文件,并只写方式打开
    2. 文件存在,则抛异常
    • a模式
    1. 文件存在,只写打开,追加内容
    2. 文件不存在,则创建后,只写打开,追加内容
    • r是只读,wxa都是只写
    • wxa模式都可产生新文件

    文件指针

    • mode = r 指针起始在0位置
    • mode = a 指针起始在EOF文件末尾位置
    • tell() 显示指针当前位置
    • seek(offset[,whence]) 移动文件指针,是按照字节偏移

    seek

    • seek(offset[,whence]) 移动文件指针。是按照字节偏移
    • offset 偏移的字节数。可以为正和负数。
    • 偏移后可以超过文件末尾EOF,超过部分用字节O表示。
    • 不能超过文件开始。如果超过会报错

    tell

    可以显示当前文件指针位置,注意指针位置是按照字节计算的。

    fil = open("test","a+") #打开文件
    fil.write("abcd你好")
    fil.seek(0) #指针回到起始位置
    fil.seek(2,0) #指针相对于开始位置向左移动2个位置
    print(fil.tell()) #查看当前指针位置
    fil.close() #关闭文件流
    • lush() 将缓冲区数据写入到磁盘
    • close() 关闭文件流。关闭前会调用flush()。文件已经关闭,再次关闭没有任何效果
    • seekable() #是否可以seek
    • readable() #是否可读
    • writable() #是否可写
    • closed #是否已经关闭

    buffering缓冲区

    • -1 表示使用缺省大小的buffer。
    • 0 只在二进制模式使用,表示关闭buffer
    • 1 只在文本模式使用,表示使用行缓冲,意思就是见到换行符flush
    • 大于1 使用指定buffer的大小

    buffer缓冲区:缓冲区是一个内存空间,一般来说是一个FIFO队列,到缓冲区满了或者达到阀值,数据才会flush到磁盘。flush()将缓冲区数据写入到磁盘,close()关闭文件流,关闭前会调用flush()

    总结规律:

    1.   文本模式,一般都用默认缓冲区大小
    2. 二进制模式,是一个个字节的操作,可以指定buffer的大小
    3. 一般来说,默认缓冲区大小是比较好的选择,除非明确知道,否则不调控它
    4. 一般编程中,明确知道需要写磁盘了,都会手动调用一次flush,而不是等到自动调用flush或者close的时候。

    encoding编码

    • encoding 编码,仅文本模式使用。如果是b字节模式,无用
    • 默认值为None表示使用缺省编码,依赖操作系统。即 为默认值None是,使用文本模式打开文件时,默认使用的编码为系统默认编码。windows下缺省值为GBK(0xBOA1),Linux下缺省值为:UTF-8

    上下文管理

    • 一般情况,系统对打开文件上限做了限制,linux中可以使用ulimit -a 查看所有限制。其中open file就是打开文件数的现在,默认是1024。如果打开文件达到上线,程序在次打开文件就会出错。出现OSError异常。为了防止打开文件后没有关闭文件,一般都需要添加异常处理。当发生异常是。关闭文件。
    f = None
    try:
        f = open('test')
        f.write("abc") # 文件是用只读模式打开,写入失败。
        f.close()
    finally:
        if f!=None:
            f.close() #当发生异常,如果f不为空,关闭文件流。释放文件对象

    上下文管理:一种特殊的语法,交给解释器去释放文件对象

    • 使用with…as 关键字
    • 上下文管理的语句块并不会开启新的作用域
    • with语句块执行完的时候,会自动关闭文件对象
    • 第一种写法示例
    del f
    #使用with...as 语法,当代码块中出现异常时,会自动关闭f
    with open("test") as f:
        f.write("abc") #因为是只读模式打开,所有会出错。写入失败
    #测试f发现f已经关闭
    f.closed 
    • 第二种写法:
    f = open("test")
    with f:
        f.write("abcd") #因为是只读模式打开,所有会出错。写入失败
    #测试f,f已经关闭
    f.closed
    • 对于类似于文件对象的IO对象,一般来说都需要在不使用的时候关闭,注销,已释放资源。IO被打开的时候,会获得一个文件描述符。计算机资源是有线的,所以操作系统都会做限制。就是为了保护计算机的资源不要被完全耗尽,计算资源是共享的,不是独占的。
    • 一般情况下,除非特别明确的知道资源情况,否则不要提高资源的限制值来解决问题。
  • 相关阅读:
    Spring Batch与ETL工具比较
    Spring Batch基本概念
    SpringBatch介绍
    2019第51周日
    用arthas的watch方法观察执行方法的输入输出
    三人行必有我师
    用arthas查看JVM已加载的类及方法信息
    线上问题排查利器Arthas
    换个视觉
    Java Servlet:服务器小程序
  • 原文地址:https://www.cnblogs.com/fjjj/p/12823917.html
Copyright © 2011-2022 走看看