<p>每个打开的文件都有一个隐式指针,该指针指示数据的读写位置。通常这默认为文件的开头,但如果使用<code>a</code>(append)模式,则默认为文件的结尾。值得注意的是,<code>w</code>模式将截断您的文件(即删除所有内容),即使您将<code>+</code>添加到该模式。</p>
<p>无论何时读或写N个字符,读/写指针都将在文件中向前移动该量。如果你还记得的话,我觉得把它想象成一盘旧磁带会有帮助。所以,如果您执行以下代码:</p>
<pre><code>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()
</code></pre>
<p>。。。它应该打印<code>This</code>,然后将文件内容保留为<code>This IS a test file.</code>。这是因为初始<code>read(4)</code>返回文件的前4个字符,因为指针位于文件的开头。它将指针放在<code>This</code>之后的空格字符处,因此下面的<code>write(" IS")</code>将用一个空格(与已经存在的空格相同)覆盖接下来的三个字符,然后是<code>IS</code>,替换现有的<code>is</code>。</p>
<p>可以使用文件的<code>seek()</code>方法跳到特定点。在上面的示例之后,如果执行以下操作:</p>
<pre><code>fd = open("testfile.txt", "r+")
fd.seek(10)
fd.write("TEST")
fd.close()
</code></pre>
<p>。。。然后您会发现该文件现在包含<code>This IS a TEST file.</code>。</p>
<p>所有这些都适用于Unix系统,您可以测试这些示例以确保。但是,我在Windows系统上混合<code>read()</code>和<code>write()</code>时遇到了问题。例如,当我在Windows机器上执行第一个示例时,它会正确地打印<code>This</code>,但是当我在之后检查文件时,<code>write()</code>被完全忽略。然而,第二个示例(使用<code>seek()</code>)在Windows上似乎工作得很好。</p>
<p>总之,如果您想在Windows中从文件中间读/写,我建议您始终使用显式<code>seek()</code>,而不是依赖读/写指针的位置。如果你只读或只写,那就相当安全了。</p>
<p>最后一点-如果要将Windows上的路径指定为文本字符串,请记住要转义反斜杠:</p>
<pre><code>fd = open("C:\\Users\\johndoe\\Desktop\\testfile.txt", "r+")
</code></pre>
<p>或者,可以通过在开始处放置<code>r</code>来使用原始字符串:</p>
<pre><code>fd = open(r"C:\Users\johndoe\Desktop\testfile.txt", "r+")
</code></pre>
<p>或者最可移植的选项是使用<code>os.path.join()</code>:</p>
<pre><code>fd = open(os.path.join("C:\\", "Users", "johndoe", "Desktop", "testfile.txt"), "r+")
</code></pre>
<p>您可以在<a href="http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files" rel="noreferrer">official Python docs</a>中找到有关文件IO的更多信息。</p>