在文件开头写()?

kri*_*tus 19 python file-io

我现在这样做,但我希望它在文件的开头写.

f = open('out.txt', 'a') # or 'w'?
f.write("string 1")
f.write("string 2")
f.write("string 3")
f.close()
Run Code Online (Sandbox Code Playgroud)

所以内容out.txt将是:

string 3
string 2
string 1
Run Code Online (Sandbox Code Playgroud)

而不是(像这样的代码):

string 1
string 2
string 3
Run Code Online (Sandbox Code Playgroud)

ktd*_*drv 13

看看这个问题.那里有一些解决方案.

虽然我可能会像Daniel和MAK那样建议 - 也许会做一个小小的课程,让事情变得更加灵活和明确:

class Prepender:

    def __init__(self, fname, mode='w'):
        self.__write_queue = []
        self.__f = open(fname, mode)

    def write(self, s):
        self.__write_queue.insert(0, s)

    def close(self):
        self.__exit__(None, None, None)

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        if self.__write_queue: 
            self.__f.writelines(self.__write_queue)
        self.__f.close()

with Prepender('test_d.out') as f:
    f.write('string 1\n')
    f.write('string 2\n')
    f.write('string 3\n')
Run Code Online (Sandbox Code Playgroud)


Dan*_*olo 7

你可以f.seek(0)在每次写入之间抛出一个(或者写一个为你做的包装函数),但是没有简单的内置方法来做到这一点.

编辑:这不起作用,即使你放在f.flush()那里它会不断覆盖.您可能只需排队写入并自行撤消订单.

而不是

f.write("string 1")
f.write("string 2")
f.write("string 3")
Run Code Online (Sandbox Code Playgroud)

也许做类似的事情:

writeList = []
writeList.append("string 1\n")
writeList.append("string 2\n")
writeList.append("string 3\n")
writeList.reverse()
f.writelines(writeList)
Run Code Online (Sandbox Code Playgroud)