【问题标题】:How to open a file for both reading and writing?如何打开一个文件进行读写?
【发布时间】:2011-10-02 16:08:42
【问题描述】:

有没有办法打开一个文件进行读写?

作为一种解决方法,我打开文件进行写入,关闭它,然后再次打开它进行读取。但是有没有办法打开一个文件来同时读写?

【问题讨论】:

  • 您要解决什么问题?也许有比写入/读取文件更好的解决方案,例如mmap
  • 您能否给我们您的代码,以便我们能够回答您。也可以试试看:docs.python.org/tutorial/…。但是我尝试使用 r+b 并且它有效。在 diff 函数中使用一个文件描述符还有什么好处吗?
  • @RomanBodnarchuk mmap 是个好主意,但如果你必须处理并发怎么办?有没有办法保留访问权限?

标签: python file file-io


【解决方案1】:

以下是读取文件,然后写入文件(覆盖任何现有数据)的方法,无需关闭并重新打开:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

【讨论】:

  • 使用a+ 覆盖文件不存在的最终情况(将被创建)
  • seek() 和 truncate() 都很关键!
  • @JossefHarush 请注意,a 的文档指出“在某些 Unix 系统上,意味着所有写入都附加到文件末尾,而不管当前的查找位置如何”。在这种情况下,f.seek(0) 将无法按预期工作。我只是在 Linux 上犯了这个错误。
  • 这里最好解释一下为什么使用seektruncate。大多数读者来自谷歌并进行复制粘贴。
  • 读完文件后,文件指针(fp)已经向前移动了,所以需要设置到开头。这就是seek(0) 所做的:它将fp 放置在0 的位置(开头)。 truncate() 将文件截断到提供的字节数,i.e. 删除指定字节数之后的所有文件内容。想象一下,你的文件有字符串Hello, world,而你写的是Bye。如果您不truncate(),最后的内容将是Byelo, world,因为您从未删除文件中存在的文本。 truncate() 将文件截断为当前 fp。
【解决方案2】:

总结 I/O 行为

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

和决策分支

【讨论】:

  • 你用什么软件制作树状图?
  • 我也有兴趣 - 迪亚?
  • 这里的“截断”是什么意思?
  • @ConorJamesThomasWarfordHen 在此上下文中“截断”的意思是“将文件截断为长度为 0”。 IE。删除文件的所有先前内容,并在打开时从一个空文件开始。
  • 这里的“封面”是什么意思?
【解决方案3】:

r+是同时读写的规范模式。这与使用fopen() 系统调用没有什么不同,因为file() / open() 只是这个操作系统调用的一个小包装。

【讨论】:

  • 它附加文件内容,而不是从头开始写入
  • fopen 是库调用,不是系统调用。
【解决方案4】:

我已经尝试过这样的事情,它按预期工作:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

地点:

f.read(size) - 要读取文件的内容,调用 f.read(size),它 读取一定数量的数据并将其作为字符串返回。

还有:

f.write(string) 将字符串的内容写入文件,返回 没有。

另外,如果你打开Python tutorial about reading and writing files,你会发现:

'r+' 打开文件进行读写。

在 Windows 上,附加到模式的 'b' 以二进制模式打开文件,所以 还有 'rb'、'wb' 和 'r+b' 等模式。

【讨论】:

  • 在使用 'r+b' 模式时,读然后写也同样有效,但你必须在 f.read() 和 f.write() 之间使用 f.seek(0) 来放置光标回到文件的开头。
  • 请注意,如果您正在写入的数据不再是已经存在的数据,则它不会被截断。使用truncate 方法来阻止它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
相关资源
最近更新 更多