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

时间:2013-04-25 06:51:34

标签: python file io

来自doc

  

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

here

  

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

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

11 个答案:

答案 0 :(得分:329)

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

  • - [R

      

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

  • RB

      

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

  • R +

      

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

  • RB +

      

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

  • 瓦特

      

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

  • WB

      

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

  • W +

      

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

  • WB +

      

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

  •   

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

  • AB

      

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

  • A +

      

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

  • AB +

      

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

答案 1 :(得分:129)

Python中的所有文件模式

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

答案 2 :(得分:99)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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)

希望这会有所帮助..

答案 5 :(得分:1)

两者看起来都一样,但是有一个陷阱。

r +:-

  • 打开文件进行读写
  • 一旦在开始文件中打开,指针将指向0
  • 现在,如果您想阅读,那么它将从头开始阅读
  • 如果要写入然后开始写入,但是写入过程将从指针0开始。因此,如果有字符,则会覆盖字符
  • 在这种情况下,应该存在文件,或者会出现 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

答案 6 :(得分:0)

实际上,关于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将从位置(0,0)覆盖它们。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

r供阅读

w进行写

r+用于读/写(如果文件存在),否则引发异常

w+用于删除原始内容,然后在文件存在的情况下进行读取/写入,否则创建文件

一些示例如下:

>>> with open("f1.txt","w") as f:
...   f.write("abcd")
... 
>>> with open("f1.txt","w+") as f:
...   f.write("o")
...   f.seek(0)
...   print(f.readlines())
... 
['o']
>>> with open("f1.txt","w+") as f:
...   f.write("abcd")
... 
>>> with open("f1.txt","r+") as f:
...   f.write("o")
...   f.seek(0)
...   print(f.readlines())
... 
['obcd']

r文件必须存在

>>> with open("f2.txt","r") as f:
...   f.write("abcd")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'f2.txt'

在读写之前先删除w

>>> with open("temp.txt", "r") as f:
...   print(f.readlines())
... 
['a\n', 'b\n', 'c\n', 'd\n']
>>> with open("temp.txt", "w+") as f:
...   print(f.readlines())
... 
[]

答案 9 :(得分:0)

以下列表可能会有所帮助

字符 含义

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

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

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

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

'b' - 二进制模式

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

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

默认模式是'r'(打开阅读文本,'rt'的同义词)。模式 'w+' 和 'w+b' 打开并截断文件。模式 'r+' 和 'r+b' 可以不截断地打开文件。

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

答案 10 :(得分:0)

我也很困惑......但我的回答可能会对某人有所帮助。 我假设您想利用“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())