内置 open 函数中的 a、a+、w、w+ 和 r+ 模式有什么区别?
- 2024-11-20 08:43:00
- admin 原创
- 9
问题描述:
在python内置的open函数中,模式,,,,w
和到底有什么区别?a
`w+a+
r+`
具体来说,文档暗示所有这些都将允许写入文件,并说它打开文件进行“追加”、“写入”和“更新”,但没有定义这些术语的含义。
解决方案 1:
打开方式与C标准库函数完全相同fopen()
。
BSDfopen
手册页对它们的定义如下:
The argument mode points to a string beginning with one of the following
sequences (Additional characters may follow these sequences.):
``r'' Open text file for reading. The stream is positioned at the
beginning of the file.
``r+'' Open for reading and writing. The stream is positioned at the
beginning of the file.
``w'' Truncate file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.
``w+'' Open for reading and writing. The file is created if it does not
exist, otherwise it is truncated. The stream is positioned at
the beginning of the file.
``a'' Open for writing. The file is created if it does not exist. The
stream is positioned at the end of the file. Subsequent writes
to the file will always end up at the then current end of file,
irrespective of any intervening fseek(3) or similar.
``a+'' Open for reading and writing. The file is created if it does not
exist. The stream is positioned at the end of the file. Subse-
quent writes to the file will always end up at the then current
end of file, irrespective of any intervening fseek(3) or similar.
解决方案 2:
我注意到,时不时我需要重新在 Google 上搜索 fopen,只是为了在脑海中勾勒出这些模式之间的主要区别。所以,我认为下次用图表来阅读会更快。也许其他人也会觉得这很有用。
解决方案 3:
相同的信息,仅以表格形式
| r r+ w w+ a a+
------------------|--------------------------
read | + + + +
write | + + + + +
write after seek | + + +
create | + + + +
truncate | + +
position at start | + + + +
position at end | + +
含义如下:(只是为了避免任何误解)
读取 - 允许读取文件
写入 - 允许写入文件
创建 - 如果文件尚不存在,则创建文件
截断-打开文件时,文件被清空(文件的所有内容都被删除)
起始位置 - 文件打开后,初始位置设置为文件起始位置
末尾位置-文件打开后,初始位置设置为文件末尾
注意:a
并a+
始终附加到文件末尾 - 忽略任何seek
移动。
顺便说一句。至少在我的 win7 / python2.7 上,对于以a+
模式打开的新文件,有趣的行为:
write('aa'); seek(0, 0); read(1); write('b')
-write
忽略第二个
write('aa'); seek(0, 0); read(2); write('b')
- 第二个write
提升IOError
解决方案 4:
r | r+ | 十 | 十+ | 瓦 | w+ | 一个 | a+ | |
---|---|---|---|---|---|---|---|---|
可读 | √ | √ | √ | √ | √ | |||
可写 | √ | √ | √ | √ | √ | √ | √ | |
默认位置:开始 | √ | √ | √ | √ | √ | √ | ||
默认位置:结束 | √ | √ | ||||||
必须存在 | √ | √ | ||||||
一定不存在 | √ | √ | ||||||
加载时截断(清除文件) | √ | √ | ||||||
始终写入 EOF | √ | √ |
模式
t(默认) | b | |
---|---|---|
str (io.TextIOBase ) | √ | |
bytes (io.BufferedIOBase ) | √ |
如果未选择模式,t
则使用文本模式 ( )。因此r
与 相同rt
。
解决方案 5:
选项与C 标准库中的fopen 函数相同:
w
截断文件,覆盖已有内容
a
附加到文件,添加已存在的内容
w+
打开并进行读写,截断文件,但也允许您读回已写入文件的内容
a+
打开以进行附加和读取,允许您附加到文件并读取其内容
解决方案 6:
我偶然发现了这一点,试图弄清楚为什么要使用模式“w+”而不是“w”。最后,我只是做了一些测试。我看不出模式“w+”有什么用处,因为在这两种情况下,文件一开始就被截断了。但是,使用“w+”,您可以通过向后搜索在写入后读取。如果您尝试使用“w”进行任何读取,它将引发 IOError。不使用模式“w+”的搜索进行读取不会产生任何结果,因为文件指针将位于您写入的位置之后。
解决方案 7:
我发现值得注意的是,python 3 对打开模式的定义与这里对 Python 2 正确的答案不同。
Python 3 的打开模式有:
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' open for exclusive creation, failing if the file already exists
'a' open for writing, appending to the end of the file if it exists
----
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newlines mode (for backwards compatibility; should not be used in new code)
模式r
、w
、x
、a
与模式修饰符b
或相结合t
,+
可选择添加,U
应避免使用。
t
正如我发现的困难一样,在文本模式下打开文件时始终指定是一个好主意,因为它是标准函数中r
的别名,但在所有压缩模块的函数中都是别名(例如读取文件时)。rt
`open()rb
open()`*.bz2
因此打开文件的模式应该是:
rt
/ wt
/ xt
/at
用于在文本模式下读取 / 写入 / 创建 / 附加到文件以及
rb
/ wb
/ xb
/ab
以二进制模式读取/写入/创建/附加到文件。
使用方式+
同前。
解决方案 8:
我认为这对于跨平台执行(即作为 CYA)来说很重要。:)
在 Windows 上,模式后面附加“b”会以二进制模式打开文件,因此还有“rb”、“wb”和“r+b”等模式。Windows 上的 Python 区分文本文件和二进制文件;在读取或写入数据时,文本文件中的行尾字符会自动略微改变。这种对文件数据的幕后修改对于 ASCII 文本文件来说没问题,但它会损坏 JPEG 或 EXE 文件中的二进制数据。在读取和写入此类文件时,请务必小心使用二进制模式。在 Unix 上,将“b”附加到模式不会有什么坏处,因此您可以独立于平台地将其用于所有二进制文件。
这是直接引用自Python Software Foundation 2.7.x。
解决方案 9:
许多人特别想知道“r+ 和 w+ 模式有什么区别?”
r+ 帮助您读取和写入数据到已经存在的文件中而不会截断(如果没有这样的文件则会出错)。
另一方面,w+ 模式也允许读取和写入,但它会截断文件(如果不存在这样的文件 - 则会创建一个新文件)。如果您想知道如何从截断的文件中读取,可以使用读取方法来读取新写入的文件(或空文件)。
干杯!
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件