困惑的python文件模式"w +"

hol*_*lys 178 python io file

来自doc,

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

w +:打开文件进行书写和阅读.如果文件存在,则覆盖现有文件.如果该文件不存在,则创建一个用于读写的新文件.

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

Nul*_*ify 380

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

  • [R

    打开文件以供阅读.文件指针位于文件的开头.这是默认模式.

  • RB

    打开文件以仅以二进制格式读取.文件指针位于文件的开头.这是默认模式.

  • R +

    打开文件进行读写.文件指针将位于文件的开头.

  • RB +

    打开二进制格式的读写文件.文件指针将位于文件的开头.

  • w ^

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

  • WB

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

  • W +

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

  • WB +

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

  • 一个

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

  • AB

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

  • A +

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

  • AB +

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

  • @Humdinger:不,`w +`创建一个新文件或截断现有文件,然后打开它进行读写; `r +`打开现有文件而不截断它以进行读写.非常不一样. (18认同)
  • `rb`不是默认模式,引用:`最常用的模式值是'r'用于读取,'w'用于写入(截断文件,如果它已经存在),'a'用于追加(在某些Unix系统上意味着无论当前的搜索位置如何,所有写入都附加到文件的末尾.如果省略mode,则默认为'r'.https://docs.python.org/2/library/functions.html#open (3认同)
  • 也许我们可以添加“x”模式,又名“独占创建”:如果文件不存在,则创建文件(用于写入),如果不存在,则引发 FileExistsError 。 (3认同)

Alo*_*wal 139

Python中的所有文件模式

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

  • 这不是所有的模式.它忽略了例如`rb`和`wb`,更不用说2.x中的`U`模式和3.x中的`t`模式(它们都可以与除了`b`之外的所有内容组合). (5认同)
  • 这个答案与@200 OK给出的答案不一致,例如`wb+`是否也从文件中读取? (2认同)

rmu*_*unn 115

假设您正在使用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'
Run Code Online (Sandbox Code Playgroud)

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

  • @NasifImtiazOhi - Python文档说,如果文件存在,`w +`将"覆盖现有文件".因此,只要用`w +`打开一个文件,它现在就是一个空文件:它包含0个字节.如果它曾用于包含数据,那么该数据已被截断 - 被截断并丢弃 - 现在文件大小为0字节,因此在使用`w +打开文件之前,您无法读取任何存在的数据*`.如果你真的想读取以前的数据并添加它,你应该使用`r +`而不是`w +`. (15认同)
  • @BeqaBukhradze - 如果您有问题,请单击“提出问题”按钮,数百人可以在这里看到。不要只单击“添加评论”按钮,只有一两个人会看到它。 (3认同)
  • “截断为 0 字节”是什么意思? (2认同)

Gra*_*eng 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$
Run Code Online (Sandbox Code Playgroud)
>>> 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'

Run Code Online (Sandbox Code Playgroud)
>>> 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
$
Run Code Online (Sandbox Code Playgroud)


小智 8

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

r+ :-

  • 打开文件进行读取和写入
  • 一旦打开,起始文件指针将指向0
  • 现在,如果您想阅读,它将从头开始阅读
  • 如果你想写就开始写,但是写过程将从指针0开始。所以如果有的话就会覆盖字符
  • 在这种情况下,文件应该存在,否则将引发FileNotFoundError 。

w+ :-

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

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

abc.txt- 一开始

1234567
abcdefg
0987654
1234
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Output

0
567
abcdefg
0987654
1234
Run Code Online (Sandbox Code Playgroud)

abc.txt- 运行后:

abcd567
abcdefg
0987654
1234Sunny
Run Code Online (Sandbox Code Playgroud)

将 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
Run Code Online (Sandbox Code Playgroud)

Output

0


Run Code Online (Sandbox Code Playgroud)

abc.txt- 运行后:

abcdSunny
Run Code Online (Sandbox Code Playgroud)