内置 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手册页对它们的定义如...

问题描述:

在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,只是为了在脑海中勾勒出这些模式之间的主要区别。所以,我认为下次用图表来阅读会更快。也许其他人也会觉得这很有用。

IT科技

解决方案 3:

相同的信息,仅以表格形式

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

含义如下:(只是为了避免任何误解)

  • 读取 - 允许读取文件

  • 写入 - 允许写入文件

  • 创建 - 如果文件尚不存在,则创建文件

  • 截断-打开文件时,文件被清空(文件的所有内容都被删除)

  • 起始位置 - 文件打开后,初始位置设置为文件起始位置

  • 末尾位置-文件打开后,初始位置设置为文件末尾

注意:aa+始终附加到文件末尾 - 忽略任何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:

rr+十+w+一个a+
可读
可写
默认位置:开始
默认位置:结束
必须存在
一定不存在
加载时截断(清除文件)
始终写入 EOF

模式

t(默认)b
strio.TextIOBase
bytesio.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)

模式rwxa与模式修饰符b或相结合t+可选择添加,U应避免使用。

t正如我发现的困难一样,在文本模式下打开文件时始终指定是一个好主意,因为它是标准函数中r的别名,但在所有压缩模块的函数中都是别名(例如读取文件时)。rt`open()rbopen()`*.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+ 模式也允许读取和写入,但它会截断文件(如果不存在这样的文件 - 则会创建一个新文件)。如果您想知道如何从截断的文件中读取,可以使用读取方法来读取新写入的文件(或空文件)。

干杯!

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用