• 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用于读取大文件;以后有时间继续扩展

  • 相关阅读:
    效率神器-uTools推荐和使用
    sqlserver数据库脱机和分离的区别
    JS "&&"操作符妙用
    小程序图片添加视频播放按钮图标
    js将秒数转换为时分秒格式
    分享一波技术党适合做浏览器首页的网站
    Coursera课程笔记----C++程序设计----Week7
    Coursera课程笔记----C++程序设计----Week6
    Coursera课程笔记----C++程序设计----Week5
    Coursera课程笔记----C++程序设计----Week4
  • 原文地址:https://www.cnblogs.com/deeper/p/7463291.html
Copyright © 2020-2023  润新知