37

我有一个包含一些内容的临时文件和一个为该文件生成一些输出的 python 脚本。我希望这重复 N 次,所以我需要重用该文件(实际上是文件数组)。我正在删除整个内容,因此临时文件在下一个周期中将为空。为了删除内容,我使用以下代码:

def deleteContent(pfile):

    pfile.seek(0)
    pfile.truncate()
    pfile.seek(0) # I believe this seek is redundant

    return pfile

tempFile=deleteContent(tempFile)

我的问题是:有没有其他(更好、更短或更安全)的方法来删除整个内容而不实际从磁盘中删除临时文件?

tempFile.truncateAll()什么?

4

5 回答 5

79

如何在python中只删除文件的内容

有几种方法可以将文件的逻辑大小设置为 0,具体取决于您访问该文件的方式:

清空打开的文件:

def deleteContent(pfile):
    pfile.seek(0)
    pfile.truncate()

清空文件描述符已知的打开文件:

def deleteContent(fd):
    os.ftruncate(fd, 0)
    os.lseek(fd, 0, os.SEEK_SET)

清空已关闭的文件(其名称已知)

def deleteContent(fName):
    with open(fName, "w"):
        pass


我有一个包含一些内容的临时文件[...] 我需要重用该文件

话虽如此,在一般情况下,重用临时文件可能既不高效也不可取。除非您有非常特殊的需求,否则您应该考虑使用tempfile.TemporaryFile上下文管理器来几乎透明地创建/使用/删除您的临时文件:

import tempfile

with tempfile.TemporaryFile() as temp:
     # do whatever you want with `temp`

# <- `tempfile` guarantees the file being both closed *and* deleted
#     on the exit of the context manager
于 2013-06-15T17:27:42.737 回答
7

我认为最简单的方法是简单地以写入模式打开文件然后关闭它。例如,如果您的文件myfile.dat包含:

"This is the original content"

然后你可以简单地写:

f = open('myfile.dat', 'w')
f.close()

这将删除所有内容。然后您可以将新内容写入文件:

f = open('myfile.dat', 'w')
f.write('This is the new content!')
f.close()
于 2016-07-07T11:53:57.923 回答
2

What could be easier than something like this:

import tempfile

for i in range(400):
    with tempfile.TemporaryFile() as tf:
        for j in range(1000):
            tf.write('Line {} of file {}'.format(j,i))

That creates 400 temp files and writes 1000 lines to each temp file. It executes in less than 1/2 second on my unremarkable machine. Each temp file of the total is created and deleted as the context manager opens and closes in this case. It is fast, secure, and cross platform.

Using tempfile is a lot better than trying to reinvent it.

于 2013-06-15T18:25:05.067 回答
2

你可以这样做:

def deleteContent(pfile):
    fn=pfile.name 
    pfile.close()
    return open(fn,'w')
于 2013-06-17T22:25:30.177 回答
0
with open(Test_File, 'w') as f:
    f.truncate(0)

我发现这种方法很容易。你可以试试这个。

于 2022-02-16T14:37:51.613 回答