打开文件进行随机写入而不截断?

时间:2015-03-07 18:14:09

标签: python

在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

是这样,追加模式坚持写到最后?

3 个答案:

答案 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",则将保留备份文件。