2024-10-01 13:25:50 发布
网友
如何打开同时被截断为0的文件进行读写?
我试过:
f = open(PATH, 'w+')
但是,我无法读取文件(f.read()返回空字符串)。
f.read()
另外:
f = os.fdopen(os.open(PATH, os.O_RDWR | os.O_TRUNC), 'r+')
与前面的代码行为相同。
下面是一个模式表:
mode-string | truncate? | create? | what's allowed -------------+-----------+---------+---------------- r | no | no | reading (only) w | yes | yes | writing (only) a | no | yes | writing (only), auto-appends r+ | no | no | read and write w+ | yes | yes | read and write a+ | no | yes | read and (auto-appending) write
注意,有一个丢失的模式(“read和non-auto-append-write,这不会截断,但会创建”)。如果你想要这个,你必须使用os函数。
os
(对于所有这些,将b添加到模式序列的末尾以对字节进行操作。没有b的行为取决于Python2与Python3的比较以及universal_newlines选项。)
b
universal_newlines
除此之外,在使用+更新模式打开的任何文件上,从“读取模式”切换到“写入模式”,或者反之亦然,在大多数情况下都需要一个seek操作。有关详细信息,请参见this answer。
+
编辑:以下是为类Unix系统定义的打开文件的各种os操作:
os.open(path, flags, mode)
path参数非常明显,并且只有在要创建文件时才使用mode参数(因此,如果不使用os.O_CREAT标志,则可以省略)。如果您确实提供了mode,那么最常见的值是0666,它对应于rw-rw-rw-。用户的“umask”(请参见os.umask)将带走不需要的权限,例如002的umask将带走最后的写入位,导致rw-rw-r--,而077将带走除初始rw-之外的所有权限。另外两种常见模式是0777(rwxrwxrwx用于可执行文件)和0600(rw-------用于用户专用文件,例如处理用户电子邮件时的临时文件)。
path
mode
os.O_CREAT
0666
rw-rw-rw-
os.umask
002
rw-rw-r--
077
rw-
0777
rwxrwxrwx
0600
rw-------
flags值应正好包含os.O_RDONLY、os.O_WRONLY或os.O_RDWR中的一个:打开以供读取(仅)、写入(仅)或同时打开。
flags
os.O_RDONLY
os.O_WRONLY
os.O_RDWR
除此之外,您还可以添加1os.O_CREAT,这意味着“如果文件不存在就创建文件”;os.O_TRUNC,这意味着“立即将文件长度截断为零字节”;和/或os.O_APPEND,这意味着“所有操作系统级的写入操作都隐式地在写入之前寻找文件的当前结尾”。可能(取决于操作系统的风格)有更多的标志,比如O_EXCL、O_NDELAY、O_NOFOLLOW等等。(可能最常用和最可靠的是O_EXCL,这意味着“如果这将打开现有文件,则失败”,因此只有与O_CREAT结合使用时才真正有用。将两者结合使用,可以创建一个新文件,以确保系统中没有其他协作进程也在使用该文件。O_NOFOLLOW标志(如果存在)在某些安全上下文中也很有用,可以避免符号链接陷阱。)
os.O_TRUNC
os.O_APPEND
O_EXCL
O_NDELAY
O_NOFOLLOW
O_CREAT
在所有情况下,给定在os级别上提供的任何读/写设置,即O_RDONLY、O_WRONLY或O_RDWR-如果随后使用os.fdopen将文件描述符包装到Python流中,则无法获得在open时间未授予自己的额外权限。你只能减去一些,也就是说,你可以用O_RDWR打开,但是fdopen流可以是只读的,也可以是写的。此外,在更新模式下使用fdopen时,不同I/O方向之间需要查找或刷新操作的恼人限制仍然存在。
O_RDONLY
O_WRONLY
O_RDWR
os.fdopen
open
fdopen
注意,fdopen级的a(append)模式,如果它被遵守的话,比O_APPEND模式(或者将a模式与open或io.open模式一起使用,所有这些都会导致设置底层的O_APPEND模式)要“弱”。这主要与共享一个文件的协作进程有关:如果两个或多个这样的进程使用O_APPEND打开了文件,只要它们的写操作“足够小”(详细信息因操作系统而异),它们的写操作就不会混杂在一起。如果文件仅以O_WRONLY或O_RDWR的形式打开,则两个协作进程可以调用底层seek函数,然后调用底层write函数,但如果这两个进程相互竞争,则其中一个进程可能会覆盖另一个进程的数据。
a
O_APPEND
io.open
(一些标志,包括O_APPEND,可以使用fcntl(来自import fcntl)和F_SETFL参数来关闭和打开。这是Python2的一个相对较晚的添加。)
fcntl
import fcntl
F_SETFL
这里的“Add”可以是字面上的加法,但是使用按位或|运算ns更为传统。也就是说,os.open(os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0666),而不是os.open(os.O_RDWR + os.O_CREAT + os.O_TRUNC, 0666)。
|
os.open(os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0666)
os.open(os.O_RDWR + os.O_CREAT + os.O_TRUNC, 0666)
如果要存储数据,请使用r+截断:
r+
with open(PATH,"r+") as f: line = f.read() f.seek(0) f.truncate()
下面是一个模式表:
注意,有一个丢失的模式(“read和non-auto-append-write,这不会截断,但会创建”)。如果你想要这个,你必须使用
os
函数。(对于所有这些,将
b
添加到模式序列的末尾以对字节进行操作。没有b
的行为取决于Python2与Python3的比较以及universal_newlines
选项。)除此之外,在使用
+
更新模式打开的任何文件上,从“读取模式”切换到“写入模式”,或者反之亦然,在大多数情况下都需要一个seek操作。有关详细信息,请参见this answer。编辑:以下是为类Unix系统定义的打开文件的各种
os
操作:path
参数非常明显,并且只有在要创建文件时才使用mode
参数(因此,如果不使用os.O_CREAT
标志,则可以省略)。如果您确实提供了mode
,那么最常见的值是0666
,它对应于rw-rw-rw-
。用户的“umask”(请参见os.umask
)将带走不需要的权限,例如002
的umask将带走最后的写入位,导致rw-rw-r--
,而077
将带走除初始rw-
之外的所有权限。另外两种常见模式是0777
(rwxrwxrwx
用于可执行文件)和0600
(rw-------
用于用户专用文件,例如处理用户电子邮件时的临时文件)。flags
值应正好包含os.O_RDONLY
、os.O_WRONLY
或os.O_RDWR
中的一个:打开以供读取(仅)、写入(仅)或同时打开。除此之外,您还可以添加1
os.O_CREAT
,这意味着“如果文件不存在就创建文件”;os.O_TRUNC
,这意味着“立即将文件长度截断为零字节”;和/或os.O_APPEND
,这意味着“所有操作系统级的写入操作都隐式地在写入之前寻找文件的当前结尾”。可能(取决于操作系统的风格)有更多的标志,比如O_EXCL
、O_NDELAY
、O_NOFOLLOW
等等。(可能最常用和最可靠的是O_EXCL
,这意味着“如果这将打开现有文件,则失败”,因此只有与O_CREAT
结合使用时才真正有用。将两者结合使用,可以创建一个新文件,以确保系统中没有其他协作进程也在使用该文件。O_NOFOLLOW
标志(如果存在)在某些安全上下文中也很有用,可以避免符号链接陷阱。)在所有情况下,给定在
os
级别上提供的任何读/写设置,即O_RDONLY
、O_WRONLY
或O_RDWR
-如果随后使用os.fdopen
将文件描述符包装到Python流中,则无法获得在open
时间未授予自己的额外权限。你只能减去一些,也就是说,你可以用O_RDWR
打开,但是fdopen
流可以是只读的,也可以是写的。此外,在更新模式下使用fdopen
时,不同I/O方向之间需要查找或刷新操作的恼人限制仍然存在。注意,
fdopen
级的a
(append)模式,如果它被遵守的话,比O_APPEND
模式(或者将a
模式与open
或io.open
模式一起使用,所有这些都会导致设置底层的O_APPEND
模式)要“弱”。这主要与共享一个文件的协作进程有关:如果两个或多个这样的进程使用O_APPEND
打开了文件,只要它们的写操作“足够小”(详细信息因操作系统而异),它们的写操作就不会混杂在一起。如果文件仅以O_WRONLY
或O_RDWR
的形式打开,则两个协作进程可以调用底层seek函数,然后调用底层write函数,但如果这两个进程相互竞争,则其中一个进程可能会覆盖另一个进程的数据。(一些标志,包括
O_APPEND
,可以使用fcntl
(来自import fcntl
)和F_SETFL
参数来关闭和打开。这是Python2的一个相对较晚的添加。)这里的“Add”可以是字面上的加法,但是使用按位或
|
运算ns更为传统。也就是说,os.open(os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0666)
,而不是os.open(os.O_RDWR + os.O_CREAT + os.O_TRUNC, 0666)
。如果要存储数据,请使用
r+
截断:相关问题 更多 >
编程相关推荐