每个打开的文件都有一个隐式指针,该指针指示将在何处读取和写入数据。通常,它默认为文件的开头,但是如果您使用a(追加)模式,则默认为文件的结尾。还值得注意的是,w即使您添加+到该模式,该模式也会截断您的文件(即删除所有内容)。
每当您读取或写入N个字符时,读/写指针都会在文件中向前移动该数量。我发现,如果您记得那些,可以将其像旧的盒式磁带一样思考。因此,如果执行以下代码:
fd = open("testfile.txt", "w+")
fd.write("This is a test file.\n")
fd.close()
fd = open("testfile.txt", "r+")
print fd.read(4)
fd.write(" IS")
fd.close()
...它应该最终打印This,然后将文件内容保留为This IS a test file.。这是因为首字母read(4)返回文件的前4个字符,因为指针位于文件的开头。它将指针留在紧随其后的空格字符处This,因此以下代码write(" IS")用空格(与已有的空格相同)覆盖接下来的三个字符,然后IS替换现有的is。
您可以使用seek()文件的方法跳到特定点。在上面的示例之后,如果执行以下操作:
fd = open("testfile.txt", "r+")
fd.seek(10)
fd.write("TEST")
fd.close()
...然后您会发现该文件现在包含This IS a TEST file.。
所有这一切都适用于Unix系统,并且可以测试这些例子,以确保。但是,我有混合的问题read(),并write()在Windows系统上。例如,当我在Windows机器上执行该第一个示例时,它可以正确打印This,但是之后再检查该文件时,该文件将write()被完全忽略。但是,第二个示例(使用seek())在Windows上似乎可以正常工作。
总而言之,如果您想在Windows中从文件的中间进行读取/写入,建议您始终使用显式seek()而不是依赖于读取/写入指针的位置。如果您只做读或写操作,那就很安全了。
最后一点-如果您将Windows上的路径指定为文字字符串,请记住转义反斜杠:
fd = open("C:\\Users\\johndoe\\Desktop\\testfile.txt", "r+")
或者,您可以通过r在开始处使用来使用原始字符串:
fd = open(r"C:\Users\johndoe\Desktop\testfile.txt", "r+")
或最可移植的选择是使用os.path.join():
fd = open(os.path.join("C:\\", "Users", "johndoe", "Desktop", "testfile.txt"), "r+")
您可以在官方Python文档中找到有关文件IO的更多信息。