ChatGPT解决这个技术问题 Extra ChatGPT

How to open a file for both reading and writing?

Is there a way to open a file for both reading and writing?

As a workaround, I open the file for writing, close it, then open it again for reading. But is there a way to open a file for both reading and writing?

what problem you are solving? maybe there is a better solution than writing/reading a file, e.g. mmap
Could you give us your code so we will be able to answer you. You can also try to take a look: docs.python.org/tutorial/… . However i have tried to use r+b and it works. Also is there any benefit to use one file descriptor in diff functions?
@RomanBodnarchuk mmap is a great idea, but what if you have to deal with concurrency? Is there a way to reserve access?

F
Flimm

Here's how you read a file, and then write to it (overwriting any existing data), without closing and reopening:

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

use a+ to cover end-case that the file does not exist (will be created)
seek() and truncate() are both critical!
@JossefHarush Note that the documentation for a states 'on some Unix systems, means that all writes append to the end of the file regardless of the current seek position'. In this case the f.seek(0) won't work as expected. I just fell foul of this on Linux.
It's better you explain why seek and truncate is used here. Most of the readers come from google and do copy-paste.
After you have read the file, the file pointer(fp) has moved forward, so you need to set it to the beginning. That's that seek(0) does: it places the fp to position 0 (i.e. the beginning). truncate() truncate the file to the provided number of bytes, i.e. removes all of the file content after the specified number of bytes. Imagine that your file has the string Hello, world and you write Bye. If you don't truncate() the content at the end will be Byelo, world, since you never deleted the text that existed in the file. truncate() truncates the file to the current fp.
F
Flimm

Summarize the I/O behaviors

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

and the decision branch

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


What software did you use to make the tree diagram?
I would be interested too - Dia?
What does "truncate" mean here?
@ConorJamesThomasWarfordHen in this context "truncate" means "truncate the file to a length of 0". I.e. remove all previous contents of the file and start with an empty file at the time of opening.
What does "cover" mean here?
D
Delgan

r+ is the canonical mode for reading and writing at the same time. This is not different from using the fopen() system call since file() / open() is just a tiny wrapper around this operating system call.


it append file content, not write from beginning
fopen is a library call, not a system call.
open is a system call, fopen is not a system call. It's fopen that's a wrapper around open.
A
Artsiom Rudzenka

I have tried something like this and it works as expected:

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

Where:

f.read(size) - To read a file’s contents, call f.read(size), which reads some quantity of data and returns it as a string.

And:

f.write(string) writes the contents of string to the file, returning None.

Also if you open Python tutorial about reading and writing files you will find that:

'r+' opens the file for both reading and writing. On Windows, 'b' appended to the mode opens the file in binary mode, so there are also modes like 'rb', 'wb', and 'r+b'.


Also reading then writing works equally well using 'r+b' mode, but you have to use f.seek(0) between f.read() and f.write() to place the cursor back at the beginning of the file.
Note that if the data you're writing isn't longer that the data already there, it will not get truncated. Use the truncate method to stop this.