用trun打开文件进行读写

2024-10-01 13:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

如何打开同时被截断为0的文件进行读写?

我试过:

f = open(PATH, 'w+')

但是,我无法读取文件(f.read()返回空字符串)。

另外:

f = os.fdopen(os.open(PATH, os.O_RDWR | os.O_TRUNC), 'r+')

与前面的代码行为相同。


Tags: 文件path字符串代码readosopenrdwr
2条回答

下面是一个模式表:

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函数。

(对于所有这些,将b添加到模式序列的末尾以对字节进行操作。没有b的行为取决于Python2与Python3的比较以及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-之外的所有权限。另外两种常见模式是0777rwxrwxrwx用于可执行文件)和0600rw-------用于用户专用文件,例如处理用户电子邮件时的临时文件)。

flags值应正好包含os.O_RDONLYos.O_WRONLYos.O_RDWR中的一个:打开以供读取(仅)、写入(仅)或同时打开。

除此之外,您还可以添加1os.O_CREAT,这意味着“如果文件不存在就创建文件”;os.O_TRUNC,这意味着“立即将文件长度截断为零字节”;和/或os.O_APPEND,这意味着“所有操作系统级的写入操作都隐式地在写入之前寻找文件的当前结尾”。可能(取决于操作系统的风格)有更多的标志,比如O_EXCLO_NDELAYO_NOFOLLOW等等。(可能最常用和最可靠的是O_EXCL,这意味着“如果这将打开现有文件,则失败”,因此只有与O_CREAT结合使用时才真正有用。将两者结合使用,可以创建一个新文件,以确保系统中没有其他协作进程也在使用该文件。O_NOFOLLOW标志(如果存在)在某些安全上下文中也很有用,可以避免符号链接陷阱。)

在所有情况下,给定在os级别上提供的任何读/写设置,即O_RDONLYO_WRONLYO_RDWR-如果随后使用os.fdopen将文件描述符包装到Python流中,则无法获得在open时间未授予自己的额外权限。你只能减去一些,也就是说,你可以用O_RDWR打开,但是fdopen流可以是只读的,也可以是写的。此外,在更新模式下使用fdopen时,不同I/O方向之间需要查找或刷新操作的恼人限制仍然存在。

注意,fdopen级的a(append)模式,如果它被遵守的话,比O_APPEND模式(或者将a模式与openio.open模式一起使用,所有这些都会导致设置底层的O_APPEND模式)要“弱”。这主要与共享一个文件的协作进程有关:如果两个或多个这样的进程使用O_APPEND打开了文件,只要它们的写操作“足够小”(详细信息因操作系统而异),它们的写操作就不会混杂在一起。如果文件仅以O_WRONLYO_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+截断:

with open(PATH,"r+") as f:
    line = f.read()
    f.seek(0)
    f.truncate()

相关问题 更多 >