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

Oli*_*ver 13 python

在python中,打开文件进行操作时可以提供一些标志.我有点困惑在于找到一个允许我在不截断的情况下随机写入的组合.我正在寻找的行为等同于C:如果它不存在则创建它,否则,打开写入(不截断)

open(filename, O_WRONLY|O_CREAT)

Python的文档令人困惑(对我而言):"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
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*ich 10

你可以用 os.open 做到这一点:

import os
f = os.fdopen(os.open(filename, os.O_RDWR | os.O_CREAT), 'rb+')
Run Code Online (Sandbox Code Playgroud)

现在您可以在文件中间读取、写入、查找等。它会创建文件。在 Python 2 和 3 上测试。


Vee*_*rac 5

你应该在rb+模式下打开.

with open("file", "rb+") as file:
    file.write(b"...")
Run Code Online (Sandbox Code Playgroud)

在Python 2上,您可以使用r+替代文本模式,但您不应该因为它可以更改您编写的文本的长度.

  • 就像“ rb +”那样违反直觉的,它是不截断,校验和为真的随机写入方式。需要注意的是,该文件必须先存在。从这个意义上讲,这并不是C的open(... O_WRONLY | O_CREAT)的行为的完全匹配,但是我认为这可能会尽善尽美。 (2认同)

Pad*_*ham -3

您需要使用"a"追加,如果文件不存在,它将创建该文件,如果存在,它将追加到该文件。

您无法使用追加执行您想要的操作,因为当您调用 write 方法时指针会自动移动到文件末尾。

您可以检查文件是否存在,然后在所需的行号上插入一行fileinput.inputinplace=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="")
Run Code Online (Sandbox Code Playgroud)

http://linux.die.net/man/3/fopen

a+ 打开以进行读取和追加(写入文件末尾)。如果文件不存在,则创建该文件。读取的初始文件位置位于文件的开头,但输出始终附加到文件的末尾。

fileinput 会f.bak复制您传入的文件,并在输出关闭时将其删除。如果您指定备份扩展名,backup=."foo"则将保留备份文件。