Python打开文件,open、with open、os.open、os.fdopen 区别

python 有封装好的函数用来打开操作文件。本文我们讲一下这几种方法的用法和区别

open

open() 函数用于打开一个文件,创建一个 file 对象
open需要手动关闭(close),如果不关闭会出现异常,一般配合try-catch一起使用,这样即使出现了异常也能正常关闭
open用法示例:

file = open(’test.txt’, ‘w’)
file.write(‘Hello, world!’)
file.close()
方式含义
r只读 可以省略打开方式 如文件不存在则报错
w只写 如文件不存在则创建 打开文件时把原来的内容删除再写,即覆盖
a追加 没有读的权限 不覆盖原先文件,直接追加到文件末尾
+可读写
r+可读写,直接写是从文件开头写,read()后文件指针跳至文件尾部,从尾部开始写入,文件不存在则报错
w+可读写,文件不存在则创建,先把原文件内容删除,再写
a+追加读写

with open

with open 会自动调用close方法,所以不需要我们手动关闭。
用法示例:

with open("test.txt","r") as file:
  for line in file.readlines():
    print(line.strip())# 把末尾的’\n’删掉

上面代码的“r”代表打开方式,下面是所有的打开方式和代表的含义:

打开方式含义
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

os.open、os.fdopen

os.open()创建操作系统级文件描述符,
os.fdopen()从文件描述符中创建一个文件对象。
文件对象是包含文件描述符的Python类,使文件更方便,容易出错。它们提供了例如错误处理,缓冲,逐行读取,字符集转换,并在收集垃圾时关闭。

文件描述符是用于处理由操作系统内核直接提供的文件的低级功能。文件描述符是一个小整数,用于标识内核为每个进程保留的打开文件的表中的打开文件。许多系统调用接受文件描述符,但它们不方便使用,通常需要固定宽度的缓冲区,某些条件下的多次重试以及手动错误处理。

内置的open()取一个文件名并返回一个新的Python文件对象。这是大多数情况下您需要的。

os.open()获取文件名并返回一个新的文件描述符。该文件描述符可以传递给其他低级函数,如os.read()和os.write()或os.fdopen(),如下所述。编写依赖于与操作系统相关的API(例如使用O_EXCL标志来打开(2))的代码时,您只需要这样做。

os.fdopen()接受现有的文件描述符 – 通常由Unix系统调用(如pipe()或dup()生成),并在其周围生成一个Python文件对象。有效地,它将文件描述符转换为完整的文件对象,这在与C代码或仅与创建低级文件描述符的API进行接口时非常有用。

可以使用os.open()(创建文件描述符)和os.fdopen()(将其包装在文件对象中)来实现内置打开:

可以使用os.fdopen和os.open来代替with open,这种方式可以显示的指定打开文件的权限
用法示例:

STAT_FLAGS = os.O_WRONLY
STAT_MODES = stat.S_IWUSR | stat.S_IRUSR
with os.fdopen(os.open(test_file, STAT_FLAGS, STAT_MODES), 'w') as fd:

test_file: 要打开的文件
STAT_FLAGS:打开的方式
STAT_MODES: 打开的权限

os.open的用法如下:

os.open(file, flags[, mode]);

flags 指定打开的方式。
flags – 该参数可以是以下选项,多个使用 “|” 隔开,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指定打开文件的权限。
mode – 该参数可以是以下选项,多个使用 “|” 隔开,mode 参数列表:

参数含义
stat.S_IXOTH其他用户有执行权0o001
stat.S_IWOTH其他用户有写权限0o002
stat.S_IROTH其他用户有读权限0o004
stat.S_IRWXO其他用户有全部权限(权限掩码)0o007
stat.S_IXGRP组用户有执行权限0o010
stat.S_IWGRP组用户有写权限0o020
stat.S_IRGRP组用户有读权限0o040
stat.S_IRWXG组用户有全部权限(权限掩码)0o070
stat.S_IXUSR拥有者具有执行权限0o100
stat.S_IWUSR拥有者具有写权限0o200
stat.S_IRUSR拥有者具有读权限0o400
stat.S_IRWXU拥有者有全部权限(权限掩码)0o700
stat.S_ISVTX目录里文件目录只有拥有者才可删除更改0o1000
stat.S_ISGID执行此文件其进程有效组为文件所在组0o2000
stat.S_ISUID执行此文件其进程有效用户为文件所有者0o4000
stat.S_IREADwindows下设为只读
stat.S_IWRITEwindows下取消只读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值