在python中,打开文件进行操作时可以提供一些标志。我有点困惑于找到一个允许我做随机写而不截断的组合。我正在寻找的行为等同于C:如果它不存在则创建它,否则,打开以进行写入(不截断)
open(filename, O_WRONLY|O_CREAT)
Python document令人困惑(对我而言):"w"
将首先截断文件,"+"
应该意味着更新,但"w+"
会截断无论如何。无论如何都可以在不使用低级os.open()
界面的情况下实现这一目标吗?
注意:"a"
或"a+"
也不起作用(如果我在这里做错了,请更正)
cat test.txt
eee
with open("test.txt", "a+") as f:
f.seek(0)
f.write("a")
cat test.txt
eeea
是这样,追加模式坚持写到最后?
答案 0 :(得分:6)
您应该以{{1}}模式打开。
rb+
在Python 2上,你可以使用with open("file", "rb+") as file:
file.write(b"...")
代替文本模式,但你不应该因为它可以改变你写的文本的长度。
答案 1 :(得分:2)
你可以用os.open:
来做import os
f = os.fdopen(os.open(filename, os.O_RDWR | os.O_CREAT), 'rb+')
现在您可以阅读,在文件中间写入,搜索等等。它创建了文件。在Python 2和3上测试。
答案 2 :(得分:0)
您需要使用"a"
进行追加,如果该文件不存在则会创建该文件,如果该文件存在则会附加到该文件中。
当你调用write方法时,指针会自动移动到文件的末尾,因此无法执行追加操作。
您可以检查文件是否存在,然后使用fileinput.input
inplace=True
在您想要的任意行号上插入一行。
import fileinput
import os
def random_write(f, rnd_n, line):
if not os.path.isfile(f):
with open(f, "w") as f:
f.write(line)
else:
for ind, line in enumerate(fileinput.input(f, inplace=True)):
if ind == rnd_n:
print("{}\n".format(line) + line, end="")
else:
print(line, end="")
http://linux.die.net/man/3/fopen
A + 打开阅读和追加(在文件末尾写)。如果文件不存在,则创建该文件。读取的初始文件位置位于文件的开头,但输出始终附加到文件的末尾。
fileinput生成您传入的文件的f.bak
副本,并在关闭输出时将其删除。如果指定备份扩展名backup=."foo"
,则将保留备份文件。