zoukankan      html  css  js  c++  java
  • open文件操作之mode模式剖析

    Python可以使用open函数来实现文件的打开,关闭,读写操作;

    Python3中的open函数定义为:

    open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

    其中mode列表为:

    'r'       #open for reading (default)
    'w'       #open for writing, truncating the file first
    'x'       #create a new file and open it for writing,python3新增
    'a'       #open for writing, appending to the end of the file if it exists
    'b'       #binary mode
    't'       #text mode (default),python3新增
    '+'       #open a disk file for updating (reading and writing)
    'U'       #universal newline mode (deprecated)

    这里我们主要关心一下'r', 'w', 'a', 'r+', 'w+', 'a+', 'x',很多人容易混淆不同模式的读写操作

    1)'r'

    只读模式,open函数中mode参数的默认模式,文件不存在的话,报FileNotFoundError(python2是IOError);

    文件打开后,初始游标位置为0;

    每次读都是从游标位置开始读;

    如果进行了写操作,会报如下异常:

    io.UnsupportedOperation: not writable

    2)'w'

    只写模式,文件不存在的话,创建文件;文件存在的话,首先清空文件,然后开始写;

    文件打开后,初始游标位置为0;

    每次写都是从游标位置开始写;

    如果进行了读操作,首先文件也会被清空,会报如下异常:

    io.UnsupportedOperation: not readable

    3)‘a’

    追加模式,文件不存在话,创建文件;文件存在的话,不会清空文件;

    文件打开后,初始游标位置为文件结尾;

    每次写都是从结尾开始写;

    如果进行了读操作,同时报如下异常:

    io.UnsupportedOperation: not readable

    上面的比较好理解,下面就有点绕了

    4)'r+'

    读写模式,文件不存在的话,报FileNotFoundError(python2是IOError);

    文件打开后,初始游标位置为0;

    每次读写都是从游标位置开始;但是对于写操作,类似于替换操作;

    看如下代码:

    文件内容为:

    abcdefg

    代码内容为:

    f = open('open_mode.txt', 'r+')
    f.write('xyz')
    f.close()

    运行代码后,文件内容变为:

    xyzdefg

    5)'w+'

    只写模式,文件不存在的话,创建文件;文件存在的话,首先清空文件;

    文件打开后,初始游标位置为0;

    每次读写都是从游标位置开始;写操作,类似于替换操作;

    6)‘a+’

    追加模式,文件不存在话,创建文件;文件存在的话,不会清空文件;

    文件打开后,初始游标位置为文件结尾;

    每次写都是从结尾开始写;

    读操作从游标位置开始;

    7) 'x'

    python3新加

    创建文件并写操作,操作必须是不存在的文件,如果操作的文件已存在,则报错FileExistsError

    不可读,如果进行了读操作,同时报如下异常:

    io.UnsupportedOperation: not readable

    最后画一张表格总结一下:

    8)'b'

    二进制形式读写文件;

    写数据时,写入的数据类型必须为字符串类型,其他类型必须通过json(就是符合json格式的字符串)写入

    python2与python3对于'b’ mode的行为不同,这和python2与python3的字符串类型有关;事实上,python的字符串类型有两种;

    Python2的两种字符串类型,分别叫做str和Unicode,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。

    Python2的两种字符串类型,分别叫做byte和str,与python2不同的是,byte实例包含原始的8位值;而str的实例,则包含Unicode字符。

    当读写文件采用'b'的模式时,要求必须以二进制形式读写,在python2中,字符串必须为str字符串,python3中必须为byte字符串;所以在python3,'b'模式下这样读写字符串

    s = b'hello world!'    #注意是byte字符串
    f = open('open_mode.txt','wb')
    f.write(s)
    View Code

    或:

    s = 'hello world!'
    f = open('open_mode.txt','wb')
    f.write(s.encode(encoding='utf-8'))
    View Code

    不然会报如下错误:

    Traceback (most recent call last):
      File "C:/Users/Desktop/Python/cnblogs/数据类型.py", line 125, in <module>
        f.write(s)
    TypeError: a bytes-like object is required, not 'str'
    View Code

    open的内容还有很多,针对于读,还有个更好的模块linecache用于读取大文件;以后有时间继续扩展

  • 相关阅读:
    微人事项目-mybatis-持久层
    通过外键连接多个表
    springioc
    Redis 消息中间件 ServiceStack.Redis 轻量级
    深度数据对接 链接服务器 数据传输
    sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取
    sqlserver 索引优化 CPU占用过高 执行分析 服务器检查
    sql server 远程备份 bak 删除
    冒泡排序
    多线程 异步 beginInvoke EndInvoke 使用
  • 原文地址:https://www.cnblogs.com/deeper/p/7463291.html
Copyright © 2011-2022 走看看