Answers:
假设您打开的文件带有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()
调用将尝试从文件末尾读取,并将返回一个空字符串。
w+
“如果文件存在,将覆盖现有文件”。因此,使用打开文件后w+
,它现在是一个空文件:它包含0个字节。如果它曾经包含数据,则该数据已被截断(剪切并丢弃),现在文件大小为0字节,因此您无法在使用打开文件之前读取任何存在的数据w+
。如果您确实想读取以前的数据并添加到其中,则应使用r+
代替w+
。
打开一个文件以供只读。文件指针放置在文件的开头。这是默认模式。
打开文件以仅以二进制格式读取。文件指针放置在文件的开头。这是默认模式。
打开一个文件进行读取和写入。文件指针将位于文件的开头。
打开一个文件,以二进制格式读取和写入。文件指针将位于文件的开头。
打开仅用于写入的文件。如果文件存在,则覆盖该文件。如果该文件不存在,则创建一个新文件进行写入。
打开一个文件,仅以二进制格式写入。如果文件存在,则覆盖该文件。如果该文件不存在,则创建一个新文件进行写入。
打开一个文件进行读写。如果文件存在,则覆盖现有文件。如果该文件不存在,请创建一个新文件以进行读写。
打开一个文件以进行二进制格式的读写。如果文件存在,则覆盖现有文件。如果该文件不存在,请创建一个新文件以进行读写。
打开一个文件进行追加。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于附加模式。如果该文件不存在,它将创建一个新文件进行写入。
打开文件以二进制格式追加。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于附加模式。如果该文件不存在,它将创建一个新文件进行写入。
打开文件以进行追加和读取。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。如果该文件不存在,它将创建一个用于读取和写入的新文件。
打开一个文件,以便以二进制格式追加和读取。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。如果该文件不存在,它将创建一个用于读取和写入的新文件。
w+
创建一个新文件或截断一个现有文件,然后将其打开以进行读写;r+
打开现有文件而不会截断该文件以进行读写。非常不一样。
r
,,w
或是a
互斥的,但b
可以添加到其中的任何一个,如+
,或U
…。这是组合爆炸。
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
Python中的所有文件模式
r
阅读r+
打开以进行读写(无法截断文件)w
用于写作 w+
用于读写(可以截断文件) rb
用于读取二进制文件。文件指针放置在文件的开头。rb+
读取或写入二进制文件wb+
编写二进制文件a+
打开进行追加ab+
打开一个文件,以附加和读取二进制文件。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。x
打开以进行独占创建,如果文件已存在则失败(Python 3)rb
和wb
,更何况U
在2.x的模式和t
在3.x的模式(其都可以以一切除了组合b
)。
wb+
也从文件中读取?
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
$
我怀疑有两种方法可以处理您认为要达到的目标。
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+
实际上,关于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)覆盖它们。
如h4z3所述,为实际使用,有时您的数据太大而无法直接加载所有内容,或者您拥有生成器或实时传入的数据,则可以使用w +存储在文件中并在以后读取。