Python读写文件的推荐写法-try-open

Python读写文件的推荐写法-try-open

python读写文件存在种写法,下面介绍最常见的两种,然后再我觉得比较规范和完整的一种写法

直接通过open来打开文件并读写文件

open的语法格式如下:

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

    • t 文本模式 (默认)。
    • x 写模式,新建一个文件,如果该文件已存在则会报错。
    • b 二进制模式。
    • + 打开一个文件进行更新(可读可写)。
    • U 通用换行模式(不推荐)。
    • r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    • rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    • r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    • rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    • w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    • wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    • w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    • wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    • a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    • ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    • a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    • ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  • buffering

    • buffering是用于设置缓冲策略的可选整数。 传递0以关闭缓冲(仅在二进制模式下允许),传递1以选择行缓冲(仅在文本模式下可用),并传递大于1的整数以指示固定大小的块缓冲区的大小
  • encoding是用于解码或编码文件的编码名称。这应该只在文本模式下使用,建议使用encoding=‘UTF-8’

  • errors是一个可选字符串,指定如何处理编码错误——这个参数不应该在二进制模式中使用。

  • newline 控制通用换行符的工作方式(仅适用于文本模式)

  • closefd 如果closefd为False,那么当文件关闭时,底层文件描述符将保持打开状态。当给定文件名时,这不起作用,在这种情况下必须为True
    样例

#读取文件
file=open('testfile.txt',mode='a+',encoding='UTF-8')
file_str=file.read()
print(file_str) #将会把当前目录下的test.file.txt内容打印出来
#写入文件,通过mode='a+' 指定在文件末尾来进行追加
file.write("this is will write in file string")

通过os.open打开文件

os.open的语法格式如下:

os.open(file,flags[,mode])
  • file 表示要打开的文件
    • flags --该参数可以是以下选项,多个使用’|'隔开:
    • os.O_RDONLY: 以只读的方式打开
    • os.O_WRONLY: 以只写的方式打开
    • os.O_RDWR : 以读写的方式打开
    • os.O_NONBLOCK: 打开时不阻塞
    • os.O_APPEND: 以追加的方式打开
    • os.O_CREAT: 创建并打开一个新文件
    • os.O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
    • os.O_EXCL: 如果指定的文件存在,返回错误
    • os.O_SHLOCK: 自动获取共享锁
    • os.O_EXLOCK: 自动获取独立锁
    • os.O_DIRECT: 消除或减少缓存效果
    • os.O_FSYNC : 同步写入
    • os.O_NOFOLLOW: 不追踪软链接
  • mode 类似chmod()

样例

    try:
        fd = os.open('testfile', os.O_RDWR)
        os.write(fd, "\n this is a test".encode())
        os.close(fd)
    except OSError:
        print('this is a OSError')

以上只是两个open和os.open的小demo,并不完整。一个完整规范的文件读取样例至少包含如下几个部分,

  • 正确的文件编码,文件目录,读取mode
  • 异常处理,python不像java一样在读写文件时要强制进行异常处理,所以在python当中读写文件时一定要进行异常处理
  • 资源关闭,在读写文件时无论读写成功与否,都一定要将资源关闭,不然很有可能造成内存泄漏等问题
  • 异常日志记录

完整的样例
建议使用open 而不是os.open,因为os.open无法指定文本编码。

import traceback

if __name__ == '__main__':
    try:
        # 采用with-open 去关闭资源,而不是try-finally,保持代码整洁
        #配置mode为读取,write时文件指针放在文件末尾,文本编码为UTF-8
        with open('testfile', 'r', encoding="UTF-8") as fh:
            file_str = fh.read()
            print(file_str)
    except IOError:
        # 如果捕获异常,记录失败日志
        traceback.print_exc()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值