被python文件模式“w +”困惑

从文档中 ,

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

在这里

w +:打开一个用于写入和读取的文件。 如果文件存在,则覆盖现有的文件。 如果文件不存在,则创build一个新的文件进行读写。

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

比方说,你打开文件与一个像你应该的声明。 然后你会做这样的事情从你的文件中读取:

 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 wrote earlier... 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()调用将尝试从文件末尾读取,并返回一个空string。

以下是打开文件的不同模式列表:

  • [R

    打开文件只读。 文件指针位于文件的开头。 这是默认模式。

  • RB

    打开一个只能以二进制格式读取的文件。 文件指针位于文件的开头。 这是默认模式。

  • R +

    打开文件进行读写。 文件指针将在文件的开头。

  • RB +

    以二进制格式打开文件进行读取和写入。 文件指针将在文件的开头。

  • w ^

    打开一个只能写入的文件。 如果文件存在,则覆盖该文件。 如果文件不存在,则创build一个新的文件进行写入。

  • WB

    打开一个只能以二进制格式写入的文件。 如果文件存在,则覆盖该文件。 如果文件不存在,则创build一个新的文件进行写入。

  • W +

    打开一个用于写入和阅读的文件。 如果文件存在,则覆盖现有的文件。 如果文件不存在,则创build一个新的文件进行读写。

  • WB +

    以二进制格式打开一个用于写入和读取的文件。 如果文件存在,则覆盖现有的文件。 如果文件不存在,则创build一个新的文件进行读写。

  • 一个

    打开一个文件进行追加。 如果文件存在,则文件指针位于文件末尾。 也就是说,该文件处于追加模式。 如果文件不存在,它将创build一个新的文件进行写入。

  • AB

    打开一个以二进制格式附加的文件。 如果文件存在,则文件指针位于文件末尾。 也就是说,该文件处于附加模式。 如果文件不存在,它将创build一个新的文件进行写入。

  • A +

    为追加和读取打开一个文件。 如果文件存在,则文件指针位于文件末尾。 该文件以附加模式打开。 如果文件不存在,它将创build一个新的文件进行读写。

  • AB +

    以二进制格式打开一个文件,用于追加和读取。 如果文件存在,则文件指针位于文件末尾。 该文件以附加模式打开。 如果文件不存在,它将创build一个新的文件进行读写。

Python中的所有文件模式

  • 阅读
  • r+打开读取和写入(不能截断文件)
  • w写作
  • w+用于写入和读取(可以截断文件)
  • 用于读取二进制文件的rb 。 文件指针位于文件的开头。
  • rb+读取或写入二进制文件
  • wb+写入一个二进制文件
  • a+打开以便追加
  • ab+打开一个文件,用于追加和读取二进制文件。 如果文件存在,则文件指针位于文件末尾。 该文件以附加模式打开。
  • x打开独家创build,如果文件已经存在则失败(Python 3)

该文件被截断,所以你可以调用read() (不会引发exception,与使用'w'打开时不同),但会得到一个空string。

我怀疑有两种方式来处理我认为你想达到的目标。

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+模式的所有其他答案都有问题。

test.in文件的内容:

 hello1 ok2 byebye3 

和py脚本的:

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

执行它并将test.in的内容更改为:

 hello1 ok2 byebye3 addition 

但是,当我们将脚本修改为:

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

test.in也做了回应:

 additionk2 byebye3 

所以,如果我们不进行读取操作, r+模式将允许我们从一开始就覆盖内容。 如果我们做一些读操作, f.write()将会附加到文件中。

顺便说一句,如果我们f.seek(0,0)f.write(write_content) f.seek(0,0)之前,write_content将会覆盖它们的位置(0,0)。