ChatGPT解决这个技术问题 Extra ChatGPT

如何打开一个文件进行读写?

有没有办法打开一个文件进行读写?

作为一种解决方法,我打开文件进行写入,关闭它,然后再次打开它进行读取。但是有没有办法打开一个文件进行读写?

你在解决什么问题?也许有比写入/读取文件更好的解决方案,例如 mmap
您能否给我们您的代码,以便我们能够回答您。你也可以试试看:docs.python.org/tutorial/…。但是我尝试使用 r+b 并且它有效。在 diff 函数中使用一个文件描述符有什么好处吗?
@RomanBodnarchuk mmap 是个好主意,但是如果您必须处理并发怎么办?有没有办法保留访问权限?

F
Flimm

以下是读取文件,然后写入文件(覆盖任何现有数据)的方式,无需关闭并重新打开:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

使用 a+ 覆盖文件不存在的最终情况(将被创建)
seek() 和 truncate() 都很关键!
@JossefHarush 请注意,a 的文档声明“在某些 Unix 系统上,意味着所有写入都附加到文件末尾,而不管当前的查找位置如何”。在这种情况下,f.seek(0) 将无法按预期工作。我刚刚在 Linux 上遇到了这个问题。
最好解释一下为什么在这里使用 seektruncate。大多数读者来自谷歌并进行复制粘贴。
读完文件后,文件指针(fp)已经向前移动了,所以你需要把它设置到开头。这就是 seek(0) 所做的:它将 fp 放置到位置 0ie 开头)。 truncate() 将文件截断到提供的字节数,ie 删除指定字节数之后的所有文件内容。假设您的文件有字符串 Hello, world,而您编写了 Bye。如果您不truncate(),最后的内容将是 Byelo, world,因为您从未删除文件中存在的文本。 truncate() 将文件截断为当前 fp。
F
Flimm

总结 I/O 行为

模式 r r+ w w+ a a+ Read + + + + Write + + + + + Create + + + + Cover + + Point in the beginning + + + + Point in end + +

和决策分支

https://i.stack.imgur.com/t4k06.png


树形图是用什么软件做的?
我也会感兴趣的——迪亚?
这里的“截断”是什么意思?
@ConorJamesThomasWarfordHen 在这种情况下“截断”的意思是“将文件截断为长度为 0”。即删除文件的所有先前内容并在打开时从一个空文件开始。
这里的“封面”是什么意思?
D
Delgan

r+ 是同时读取和写入的规范模式。这与使用 fopen() 系统调用没有什么不同,因为 file() / open() 只是这个操作系统调用的一个小包装。


它附加文件内容,而不是从头开始写入
fopen 是库调用,而不是系统调用。
open 是系统调用,fopen 不是系统调用。 fopenopen 的包装。
A
Artsiom Rudzenka

我已经尝试过这样的事情,它按预期工作:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

在哪里:

f.read(size) - 要读取文件的内容,调用 f.read(size),它会读取一定数量的数据并将其作为字符串返回。

和:

f.write(string) 将 string 的内容写入文件,返回 None。

此外,如果您打开 Python tutorial about reading and writing files,您会发现:

'r+' 打开文件进行读写。在 Windows 上,附加到模式的 'b' 以二进制模式打开文件,因此还有 'rb'、'wb' 和 'r+b' 等模式。


使用 'r+b' 模式读取然后写入同样有效,但是您必须在 f.read() 和 f.write() 之间使用 f.seek(0) 将光标放回文件的开头。
请注意,如果您正在写入的数据不再是已经存在的数据,则它不会被截断。使用 truncate 方法停止此操作。