内置 open 函数中的 a、a+、w、w+ 和 r+ 模式有什么区别?

2024-11-20 08:43:00
admin
原创
236
摘要:问题描述:在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+ 模式也允许读取和写入,但它会截断文件(如果不存在这样的文件 - 则会创建一个新文件)。如果您想知道如何从截断的文件中读取,可以使用读取方法来读取新写入的文件(或空文件)。

干杯!

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1265  
  IPD(Integrated Product Development)即集成产品开发,是一套先进的、成熟的产品开发管理理念、模式和方法。随着市场竞争的日益激烈,企业对于提升产品开发效率、降低成本、提高产品质量的需求愈发迫切,IPD 项目管理咨询市场也迎来了广阔的发展空间。深入探讨 IPD 项目管理咨询的市场需求与发展,...
IPD集成产品开发流程   17  
  IPD(Integrated Product Development)产品开发流程是一套先进的、被广泛应用的产品开发管理体系,它涵盖了从产品概念产生到产品推向市场并持续优化的全过程。通过将市场、研发、生产、销售等多个环节紧密整合,IPD旨在提高产品开发的效率、质量,降低成本,增强企业的市场竞争力。深入了解IPD产品开发...
IPD流程中TR   21  
  IPD(Integrated Product Development)测试流程是确保产品质量、提升研发效率的关键环节。它贯穿于产品从概念到上市的整个生命周期,对企业的成功至关重要。深入理解IPD测试流程的核心要点,有助于企业优化研发过程,打造更具竞争力的产品。以下将详细阐述IPD测试流程的三大核心要点。测试策略规划测试...
华为IPD   18  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,在创新管理与技术突破方面发挥了至关重要的作用。深入剖析华为 IPD 流程中的创新管理与技术突破,对于众多企业探索自身发展路径具有重要的借鉴意义。IPD 流程概述IPD 流程是一种先进的产品开发管理理念和方...
TR评审   16  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用