如何打开文件进行读写?


210

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

解决方法是,打开文件进行写入,将其关闭,然后再次打开以进行读取。但是,有没有办法打开一个文件阅读和写作?


3
您正在解决什么问题?也许有比写入/读取文件更好的解决方案,例如mmap
Roman Bodnarchuk 2011年

1
您能给我们您的代码,以便我们给您答复。您也可以尝试看看:docs.python.org/tutorial/…。但是我尝试使用r + b并能正常工作。在diff函数中使用一个文件描述符也有好处吗?
Artiom Rudzenka 2011年

@RomanBodnarchuk mmap是个好主意,但是如果您必须处理并发怎么办?有保留访问权限的方法吗?
Dr_Zaszuś

Answers:


267

在不关闭和重新打开的情况下,读取文件然后写入文件(覆盖所有现有数据)的方法如下:

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

41
用于a+掩盖文件不存在(将被创建)的最终情况
Jossef Harush

16
seek()和truncate()都是至关重要的!
smwikipedia '16

4
@JossefHarush注意,关于a状态的文档“在某些Unix系统上,意味着所有写操作都追加到文件末尾,而不管当前的查找位置如何”。在这种情况下,f.seek(0)将无法按预期工作。我只是在Linux上犯规。
Graeme

6
最好解释一下为什么,seektruncate在这里使用。大多数读者来自Google并进行复制粘贴。
Shiplu Mokaddim

7
读取文件后,文件指针(fp)向前移动,因此需要将其设置为开头。就是seek(0)这样:它将fp放置到位置0开始位置)。truncate()将文件截断为提供的字节数,在指定的字节数后删除所有文件内容。想象一下,您的文件包含字符串,Hello, world并且您编写了Bye。如果不这样做truncate(),则末尾的内容将为Byelo, world,因为您从未删除文件中存在的文本。truncate()将文件截断为当前fp。
Illya Gerasymchuk '19

48

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


它附加文件内容,而不是从头开始写入
TomSawyer

47

总结I / O行为

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

和决策分支

在此处输入图片说明


您使用什么软件制作树形图?
Flux

我也会感兴趣-Dia?
nerdoc

22

我已经尝试过类似的方法,并且可以按预期工作:

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)将string的内容写入文件,返回None。

另外,如果您打开有关读写文件的Python教程,则会发现:

“ r +”打开文件以供读取和写入。

在Windows上,附加到模式的'b'以二进制模式打开文件,因此也有'rb','wb'和'r + b'之类的模式。


5
同样,使用'r + b'模式进行读后写同样有效,但是您必须在f.read()和f.write()之间使用f.seek(0)才能将光标放回到文件的开头。
令人惊讶的2012年

2
请注意,如果您要写入的数据不再是已经存在的数据,它将不会被截断。使用该truncate方法可以停止此操作。
Flimm 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.