253

文档中,

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

这里

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

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

4

11 回答 11

516

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

  • r

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

  • rb

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

  • r+

    打开一个文件进行读写。文件指针将位于文件的开头。

  • rb+

    以二进制格式打开一个文件进行读写。文件指针将位于文件的开头。

  • w

    打开一个仅用于写入的文件。如果文件存在,则覆盖文件。如果文件不存在,则创建一个新文件进行写入。

  • wb

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

  • w+

    打开一个文件进行写入和读取。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读写。

  • wb+

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

  • 一个

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

  • 抗体

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

  • 一个+

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

  • ab+

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

于 2014-05-09T14:19:17.630 回答
165

Python中的所有文件模式

  • r用于阅读
  • r+打开读写(不能截断文件)
  • w写作
  • w+用于写入和读取(可以截断文件)
  • rb用于读取二进制文件。文件指针位于文件的开头。
  • rb+读取或写入二进制文件
  • wb+写一个二进制文件
  • a+打开以追加
  • ab+打开一个文件以附加和读取二进制文件。如果文件存在,则文件指针位于文件末尾。该文件以附加模式打开。
  • x打开以进行独占创建,如果文件已存在则失败(Python 3)
于 2013-04-25T10:30:37.103 回答
158

假设您正在使用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()调用将尝试从文件末尾读取,并将返回一个空字符串。

于 2013-04-25T06:57:27.130 回答
14

r供阅读

w

r+如果文件存在,则用于读/写而不删除原始内容,否则引发异常

w+删除原始内容,如果文件存在则读/写,否则创建文件

例如,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'

>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$
于 2019-07-18T01:01:01.080 回答
6

两者似乎工作相同,但有一个问题。

r+ :-

  • 打开文件进行读写
  • 一旦在开始文件中打开,指针将指向 0
  • 现在,如果您想阅读,那么它将从头开始阅读
  • 如果你想写然后开始写,但是写过程将从指针0开始。所以会有字符覆盖,如果有的话
  • 在这种情况下 File 应该存在,要么FileNotFoundError将被提出。

w+ :-

  • 打开文件进行读写
  • 如果文件存在,将打开文件并删除所有数据,
  • 如果文件不存在,则将创建新文件
  • 在开始的文件指针将指向 0(因为没有数据)
  • 现在如果你想写点什么,那就写
  • 文件指针现在指向文件结尾(在写入过程之后)
  • 如果您现在想读取数据,请寻找特定点。(用于开始寻找(0))

因此,总的来说,两者都是为了打开文件进行读写,但区别在于我们是要在开始时擦除数据然后进行读/写,还是按原样开始。

abc.txt- 一开始

1234567
abcdefg
0987654
1234

Code for r+

with open('abc.txt', 'r+') as f:      # abc.txt should exist before opening
    print(f.tell())                   # Should give ==> 0
    f.write('abcd')                   
    print(f.read())                   # Pointer is pointing to index 3 => 4th position
    f.write('Sunny')                  # After read pointer is at End of file

Output

0
567
abcdefg
0987654
1234

abc.txt- 运行后:

abcd567
abcdefg
0987654
1234Sunny

将 abc.txt 重置为初始值

Code for w+

with open('abc.txt', 'w+') as f:     
    print(f.tell())                   # Should give ==> 0
    f.write('abcd')                   
    print(f.read())                   # Pointer is pointing to index 3 => 4th position
    f.write('Sunny')                  # After read pointer is at End of file

Output

0


abc.txt- 运行后:

abcdSunny
于 2020-11-18T08:50:03.590 回答
2

该文件被截断,因此您可以调用read()(不引发异常,与使用 'w' 打开时不同),但您会得到一个空字符串。

于 2013-04-25T06:57:23.453 回答
2

我怀疑有两种方法可以处理我认为您想要实现的目标。

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)

希望这可以帮助..

于 2013-04-25T07:02:48.480 回答
2

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

test.in文件内容:</p>

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),write_content 将从 positon(0,0) 开始覆盖它们。

于 2016-07-29T01:42:05.433 回答
1

这是列表可能会有所帮助

字符 含义

'r' - 打开阅读(默认)

'w' - 打开写入,首先截断文件

'x' - 打开以独占创建,如果文件已存在则失败

'a' - 打开写入,如果存在则附加到文件末尾

'b' - 二进制模式

't' - 文本模式(默认)

'+' - 打开更新(读取和写入)

默认模式是“r”(打开阅读文本,“rt”的同义词)。模式“w+”和“w+b”打开并截断文件。模式 'r+' 和 'r+b' 打开文件时不会被截断。

参考:https ://docs.python.org/3/library/functions.html#open

于 2021-03-05T16:39:32.597 回答
1

我也很困惑......但可能是我的回答会帮助某人。我假设您想利用 'w+' 模式的能力来创建文件(如果文件不存在)。

实际上,如果文件不存在,则只有 w、w+、a、a+ 可以创建。

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

因此,您最好的朋友可能是带有 file.seek(0) 的 a+:

with open('somefile.txt', 'a+') as f:
    f.seek(0)
    for line in f:
        print(f.readline())
于 2021-07-13T19:58:45.250 回答
0

正如h4z3 所说,对于实际使用,有时您的数据太大而无法直接加载所有内容,或者您​​有生成器,或者实时传入数据,您可以使用 w+ 存储在文件中并稍后读取。

于 2019-06-18T14:48:23.910 回答