IT-Swarm.Net

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

来自 doc

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

这里

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

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

158
holys

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

99
rmunn

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

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

  • [R

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

  • rB

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

  • r +

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

  • rB +

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

  • w ^

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

  • wB

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

  • w +

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

  • wB +

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

  • 一个

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

  • aB

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

  • a +

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

  • aB +

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

328
Nullify

Python中的所有文件模式

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

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

2
Elazar

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

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)

希望这可以帮助..

1
Dory Zidon

实际上,关于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)覆盖它们。.

0
Find