被python文件模式“ w +”混淆


201

文档

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

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

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


27
我发现图非常有用。
Ritwik

Answers:


132

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


1
“截断为0字节”是什么意思?
Nasif Imtiaz Ohi

22
@NasifImtiazOhi-Python文档说,w+“如果文件存在,将覆盖现有文件”。因此,使用打开文件后w+,它现在是一个空文件:它包含0个字节。如果它曾经包含数据,则该数据已被截断(剪切并丢弃),现在文件大小为0字节,因此您无法使用打开文件之前读取任何存在的数据w+。如果您确实想读取以前的数据并添加到其中,则应使用r+代替w+
rmunn

如何在顶部添加新数据?
Beqa Bukhradze '18年

1
@BeqaBukhradze-如果您有任何问题,请单击“问问题”按钮,数百个人将在此按钮看到。不要只单击“添加评论”按钮,只有一个或两个人可以看到它。
rmunn

429

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

  • [R

    打开一个文件以供只读。文件指针放置在文件的开头。这是默认模式。

  • rb

    打开文件以仅以二进制格式读取。文件指针放置在文件的开头。这是默认模式。

  • r +

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

  • rb +

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

  • w

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

  • b

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

  • w +

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

  • wb +

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

  • 一个

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

  • b

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

  • a +

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

  • ab +

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


因此,对于所有密集用途,r +和w +是相同的吗?
尼克·休里希

21
@Humdinger:否,w+创建一个新文件或截断一个现有文件,然后将其打开以进行读写;r+打开现有文件而不会截断该文件以进行读写。非常不一样。
2014年

此外,与@AlokAgarwal的答案一样,它声称是模式的详尽列表,但事实并非如此。
2014年

1
详尽列出模式是很愚蠢的,因为它们的功能更像是具有多个参数的功能。r,,w或是a互斥的,但b可以添加到其中的任何一个,如+,或U…。这是组合爆炸。
rmunn 2014年

4
rb是不是默认模式下,报价:The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
伊基

158

Python中的所有文件模式

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

5
这不是所有的模式。它忽略,例如,rbwb,更何况U在2.x的模式和t在3.x的模式(其都可以以一切除了组合b)。
2014年

1
r +和w +之间的区别在于w +在打开文件时会截断文件。但是您可以在两种模式下手动截断它。
马丁

1
此答案与@ 200 OK给出的答案不一致,例如是否wb+也从文件中读取?
Celeritas

@Celeritas wb指示已打开文件以二进制模式写入。在Unix系统(Linux,Mac OS X等)上,二进制模式不执行任何操作-它们对待文本文件的方式与对待其他文件的方式相同。但是,在Windows上,文本文件的行尾有少许修改。在处理实际的二进制文件(例如exe或jpg文件)时,这会导致严重的问题。因此,即使在Unix中,打开不应该是文本的文件时,也应使用wb或rb。仅对文本文件使用纯w或r。
Alok Agarwal 2015年

在Python 3中,还有'x'打开模式:打开以进行独占创建,如果文件已经存在则失败。请参阅文档中的开放功能。
洛朗·劳波特

9

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
$

2

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


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)

希望这可以帮助..


那又是什么呢 r+
SmartManoj19年

1

实际上,关于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)这样做过,write_content将从positon(0,0)覆盖它们。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.