医生说,

模式'r+', 'w+'和'a+'打开文件进行更新(注意'w+'会截断文件)。在区分二进制文件和文本文件的系统上,在模式后追加'b'以二进制模式打开文件;在没有这种区别的系统中,添加“b”没有任何效果。

这里

w+:打开文件进行读写操作。如果文件存在,则覆盖现有文件。如果该文件不存在,则创建一个新文件进行读写。

但是,如何用w+读取打开的文件?


当前回答

如h4z3所述, 在实际应用中, 有时你的数据太大,不能直接加载所有内容,或者你有一个生成器,或者实时传入的数据,你可以使用w+存储在一个文件中,然后读取。

其他回答

文件被截断了,所以你可以调用read()(不会引发异常,不像使用'w'打开时那样),但你会得到一个空字符串。

我也很困惑……但也许我的答案会帮助到别人。 我假设您希望利用“w+”模式来创建不存在的文件。

实际上,如果文件不存在,只能创建w, w+, a, a+。

但是如果你需要读取文件的数据(当有数据的文件确实存在的情况下),你不能用w+开箱即用,因为它会截断文件。哎呀,你不是那个意思!

所以,你最好的朋友可能是file.seek(0)的+:

with open('somefile.txt', 'a+') as f:
    f.seek(0)
    for line in f:
        print(f.readline())

我认为有两种方法可以解决你想要达到的目标。

1)这是显而易见的,打开文件只读,读入内存,然后用t打开文件,然后写你的更改。

2)使用低级文件处理例程:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

希望这能有所帮助。

实际上,其他关于r+模的答案都有问题。

测试。在文件内容中:

hello1
ok2
byebye3

py脚本是:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

执行它和测试。In的内容将更改为:

hello1
ok2
byebye3
addition

然而,当我们将脚本修改为:

with open("test.in", 'r+')as f:
    f.write("addition")

测试。也可以这样回答:

additionk2
byebye3

因此,如果我们不执行读取操作,r+模式将允许我们从头覆盖内容。如果我们做一些读操作,f.r ewrite()只会追加到文件中。

顺便说一下,如果我们在f.e re (write_content)之前执行f.e re (0,0), write_content将从(0,0)位置开始覆盖它们。

假设你用一个with语句打开文件,就像你应该做的那样。然后你可以这样从你的文件中读取:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

注意f.seek(0)——如果您忘记了这一点,f.read()调用将尝试从文件末尾读取,并返回一个空字符串。