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()