首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >初学者Python:读取和写入同一文件

初学者Python:读取和写入同一文件
EN

Stack Overflow用户
提问于 2013-01-11 11:31:51
回答 3查看 98.4K关注 0票数 33

一周前开始使用Python,我有一些关于读写相同文件的问题要问。我已经在网上看了一些教程,但我仍然对此感到困惑。我能理解简单的读写文件。

代码语言:javascript
复制
openFile = open("filepath", "r")
readFile = openFile.read()
print readFile 

openFile = open("filepath", "a")
appendFile = openFile.write("\nTest 123")

openFile.close()

但是,如果我尝试执行以下操作,我会在要写入的文本文件中得到一堆未知文本。谁能解释为什么我会收到这样的错误,为什么我不能以如下所示的方式使用相同的openFile对象。

代码语言:javascript
复制
# I get an error when I use the codes below:       
openFile = open("filepath", "r+")
writeFile = openFile.write("Test abc")

readFile = openFile.read()
print readFile

openFile.close()

我会试着澄清我的问题。在上面的示例中,openFile是用于打开文件的对象。如果我第一次想要写它,我没有问题。如果我想使用相同的openFile来读取文件或向其追加某些内容。它没有发生,或者给出了一个错误。我必须先声明相同/不同的打开文件对象,然后才能对同一文件执行另一个读/写操作。

代码语言:javascript
复制
#I have no problems if I do this:    
openFile = open("filepath", "r+")
writeFile = openFile.write("Test abc")

openFile2 = open("filepath", "r+")
readFile = openFile2.read()
print readFile

openFile.close()

如果有人能告诉我我在这里做错了什么,或者这只是一个Pythong的事情,我将不胜感激。我使用的是Python 2.7。谢谢!

EN

回答 3

Stack Overflow用户

发布于 2013-01-11 18:25:05

每个打开的文件都有一个隐式指针,指示数据将被读取和写入的位置。通常情况下,默认设置为文件的开头,但如果使用a (append)模式,则默认设置为文件的末尾。同样值得注意的是,即使你在模式中添加了+w模式也会截断你的文件(即删除所有内容)。

每当您读取或写入N个字符时,读/写指针将在文件内向前移动N个字符。如果你还记得的话,我发现把它想象成一盘旧的卡式磁带会很有帮助。因此,如果您执行以下代码:

代码语言:javascript
复制
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()方法跳转到特定点。在上面的示例之后,如果您执行了以下命令:

代码语言:javascript
复制
fd = open("testfile.txt", "r+")
fd.seek(10)
fd.write("TEST")
fd.close()

..。然后,您会发现该文件现在包含This IS a TEST file.

所有这些都适用于Unix系统,您可以测试这些示例以确保。然而,我在Windows系统上混合使用read()write()时遇到了问题。例如,当我在我的Windows机上执行第一个示例时,它正确地打印了This,但当我随后检查文件时,write()被完全忽略了。然而,第二个例子(使用seek())似乎在Windows上工作得很好。

总之,如果你想从文件中间读/写,我建议你总是使用显式的seek(),而不是依赖读/写指针的位置。如果你只读或者只写,那么它是非常安全的。

最后一点-如果你在Windows上指定路径为文字字符串,记得转义你的反斜杠:

代码语言:javascript
复制
fd = open("C:\\Users\\johndoe\\Desktop\\testfile.txt", "r+")

或者,您可以通过在开头放置一个r来使用原始字符串:

代码语言:javascript
复制
fd = open(r"C:\Users\johndoe\Desktop\testfile.txt", "r+")

或者,最可移植的选择是使用os.path.join()

代码语言:javascript
复制
fd = open(os.path.join("C:\\", "Users", "johndoe", "Desktop", "testfile.txt"), "r+")

您可以在official Python docs中找到有关文件IO的更多信息。

票数 11
EN

Stack Overflow用户

发布于 2013-01-11 11:35:28

读取和写入发生在当前文件指针所在的位置,并且每次读取/写入时都会前进。在您的特定情况下,写入openFile会导致文件指针指向文件的末尾。尝试从末尾读取将导致EOF。您需要重置文件指针,使其在读取文件之前通过seek(0)指向文件的开头

票数 3
EN

Stack Overflow用户

发布于 2020-05-11 19:28:23

您可以在python中读取、修改和保存到同一个文件,但实际上您必须替换文件中的全部内容,并在更新文件内容之前进行调用:

代码语言:javascript
复制
# set the pointer to the beginning of the file in order to rewrite the content
edit_file.seek(0)

我需要一个函数来遍历文件夹的所有子目录,并根据一些条件编辑文件的内容,如果有帮助的话:

代码语言:javascript
复制
new_file_content = ""
for directories, subdirectories, files in os.walk(folder_path):
    for file_name in files:
        file_path = os.path.join(directories, file_name)
        # open file for reading and writing
        with io.open(file_path, "r+", encoding="utf-8") as edit_file:
            for current_line in edit_file:
                if condition in current_line:
                    # update current line
                    current_line = current_line.replace('john', 'jack')
                new_file_content += current_line
            # set the pointer to the beginning of the file in order to rewrite the content
            edit_file.seek(0)
            # delete actual file content
            edit_file.truncate()
            # rewrite updated file content
            edit_file.write(new_file_content)
            # empties new content in order to set for next iteration
            new_file_content = ""
            edit_file.close()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14271216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档