在python内置的开放函数中,w、a、w+、a+和r+模式之间的确切区别是什么?
特别是,文档暗示所有这些都将允许写入文件,并表示它将打开文件以进行“附加”、“写入”和“更新”,但没有定义这些术语的含义。
在python内置的开放函数中,w、a、w+、a+和r+模式之间的确切区别是什么?
特别是,文档暗示所有这些都将允许写入文件,并表示它将打开文件以进行“附加”、“写入”和“更新”,但没有定义这些术语的含义。
当前回答
我偶然发现了这一点,试图弄清楚为什么你会使用模式“w+”而不是“w”。最后,我只是做了一些测试。我看不出模式“w+”有多大用途,因为在这两种情况下,文件都是从开头截断的。然而,使用“w+”,您可以在写作后通过查找来阅读。如果尝试使用“w”进行任何读取,将引发IOError。在“w+”模式下不使用搜索进行读取不会产生任何结果,因为文件指针将在您写入的位置之后。
其他回答
打开模式与C标准库函数fopen()的打开模式完全相同。
BSD fopen手册页对它们的定义如下:
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.
选项与C标准库中fopen函数的选项相同:
w截断文件,覆盖已经存在的内容
a附加到文件,添加到已经存在的文件中
w+打开用于读取和写入,截断文件,但也允许您读取已写入文件的内容
a+打开用于附加和读取,允许您附加到文件并读取其内容
我偶然发现了这一点,试图弄清楚为什么你会使用模式“w+”而不是“w”。最后,我只是做了一些测试。我看不出模式“w+”有多大用途,因为在这两种情况下,文件都是从开头截断的。然而,使用“w+”,您可以在写作后通过查找来阅读。如果尝试使用“w”进行任何读取,将引发IOError。在“w+”模式下不使用搜索进行读取不会产生任何结果,因为文件指针将在您写入的位置之后。
我注意到,我时不时地需要在谷歌上搜索一遍,只是为了在脑海中建立一个模式之间主要区别的形象。所以,我想下次看图表会更快。也许其他人也会觉得这很有用。
许多人特别疑惑的是“r+和w+模式之间有什么区别?”?
r+帮助您在不截断的情况下将数据读写到已经存在的文件上(如果没有这样的文件,则为错误)。
另一方面,w+模式也允许读取和写入,但它会截断文件(如果不存在这样的文件,则会创建一个新文件)。如果您想知道如何从截断的文件中读取,可以使用读取方法来读取新写入的文件(或空文件)。
干杯