一周前开始使用Python,我有一些关于读写相同文件的问题要问。我已经在网上看了一些教程,但我仍然对此感到困惑。我能理解简单的读写文件。
openFile = open("filepath", "r")
readFile = openFile.read()
print readFile
openFile = open("filepath", "a")
appendFile = openFile.write("\nTest 123")
openFile.close()
但是,如果我尝试执行以下操作,我会在要写入的文本文件中得到一堆未知文本。谁能解释为什么我会收到这样的错误,为什么我不能以如下所示的方式使用相同的openFile对象。
# 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来读取文件或向其追加某些内容。它没有发生,或者给出了一个错误。我必须先声明相同/不同的打开文件对象,然后才能对同一文件执行另一个读/写操作。
#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。谢谢!
发布于 2013-01-11 18:25:05
每个打开的文件都有一个隐式指针,指示数据将被读取和写入的位置。通常情况下,默认设置为文件的开头,但如果使用a
(append)模式,则默认设置为文件的末尾。同样值得注意的是,即使你在模式中添加了+
,w
模式也会截断你的文件(即删除所有内容)。
每当您读取或写入N个字符时,读/写指针将在文件内向前移动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系统,您可以测试这些示例以确保。然而,我在Windows系统上混合使用read()
和write()
时遇到了问题。例如,当我在我的Windows机上执行第一个示例时,它正确地打印了This
,但当我随后检查文件时,write()
被完全忽略了。然而,第二个例子(使用seek()
)似乎在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+")
您可以在official Python docs中找到有关文件IO的更多信息。
发布于 2013-01-11 11:35:28
读取和写入发生在当前文件指针所在的位置,并且每次读取/写入时都会前进。在您的特定情况下,写入openFile
会导致文件指针指向文件的末尾。尝试从末尾读取将导致EOF。您需要重置文件指针,使其在读取文件之前通过seek(0)
指向文件的开头
发布于 2020-05-11 19:28:23
您可以在python中读取、修改和保存到同一个文件,但实际上您必须替换文件中的全部内容,并在更新文件内容之前进行调用:
# set the pointer to the beginning of the file in order to rewrite the content
edit_file.seek(0)
我需要一个函数来遍历文件夹的所有子目录,并根据一些条件编辑文件的内容,如果有帮助的话:
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()
https://stackoverflow.com/questions/14271216
复制相似问题