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

如何在python中只删除文件的内容,python,file-io,seek,Python,File Io,Seek,我有一个包含一些内容的临时文件和一个python脚本,该脚本生成该文件的一些输出。我希望它重复N次,所以我需要重用该文件(实际上是文件数组)。我正在删除全部内容,因此临时文件在下一个周期中将为空。对于删除内容,我使用以下代码: def deleteContent(pfile): pfile.seek(0) pfile.truncate() pfile.seek(0) # I believe this seek is redundant return pfile

我有一个包含一些内容的临时文件和一个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()

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

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

要清空打开的文件,请执行以下操作:

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

要清空文件描述符已知的打开文件,请执行以下操作:

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

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



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

也就是说,在一般情况下,重用临时文件可能既不高效也不可取。除非您有非常特殊的需要,否则您应该考虑使用和上下文管理器几乎透明地创建/使用/删除临时文件:

import tempfile

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

# <- `tempfile` guarantees the file being both closed *and* deleted
#     on exit of the context manager
导入临时文件
使用tempfile.TemporaryFile()作为临时文件:
#用“temp”做任何你想做的事`

#还有什么比这更容易的事情呢:

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))
这将创建400个临时文件,并向每个临时文件写入1000行。它在我不起眼的机器上执行不到1/2秒。在本例中,当上下文管理器打开和关闭时,将创建和删除总数中的每个临时文件。它是快速、安全和跨平台的

使用比试图重新发明要好得多

您可以这样做:

def deleteContent(pfile):
    fn=pfile.name 
    pfile.close()
    return open(fn,'w')

我认为最简单的方法是以写模式打开文件,然后关闭它。例如,如果您的文件
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()

第二次寻求确实是多余的。为什么不创建一个新的临时文件呢?因为对于一个常见的脚本运行,我需要大约400个临时文件,而不是大约10个。所以我认为最好是回收利用。我错了吗?你遇到实际问题了吗?我只需要创建新的临时文件,让Python和操作系统清理我关闭的文件。实际上删除和关闭它们会让代码更加混乱。我的解决方案没有问题,我只需要知道更多的方法,并测试性能(同时让代码变得简单)。如果您正在使用,则不需要删除任何内容。将临时文件用作上下文管理器(
with…
),它也将自动关闭。
pfile.truncate(0)
不会重置文件指针,因此您需要以任何方式执行
pfile.seek(0)
。这同样适用于
os.ftruncate()
。FWIW,您可以从
pfile.fileno()
中获取文件描述符,因此
os.ftruncate(pfile.fileno(),0)
可以工作,但之后仍然需要执行
pfile.seek(0)
。请注意,如果指定的大小超过文件的当前大小,结果取决于平台:可能的情况包括文件可能保持不变,增加到指定的大小,就像零填充一样,或者使用未定义的新内容增加到指定的大小这就是为什么我没有这么做。@SylvainLeroux不适合我,它不适合我<代码>f=打开('foo','wb');f、 写('foo');f、 截断(0);f、 写('foo');print f.tell()
为我打印
6
@SylvainLeroux内容是
“\x00\x00\x00\x00\x00\x00Bonjour”
。对
foo
执行
xxd
检查。因此,实际上,您正在创建一个@SylvainLeroux,无论哪种方式,我都会得到前导空值。Linux无论如何都会忽略
b
标志。从…起“模式字符串还可以将字母‘b’作为最后一个字符,或作为上述两个字符串中任何一个字符之间的字符。这是严格为了与C89兼容,没有任何效果;在所有符合POSIX标准的系统上,包括Linux,都会忽略‘b’。”我认为
seek(0)
truncate()
没有for cycle实际上更容易、更好(可能更快),而且对OS/python更友好:)我担心有人会在重用/回收过程中被抓住。。。我的问题还是一样的,所以这实际上不是答案。你测试过这个假设吗?你给它计时看了吗?
f = open('myfile.dat', 'w')
f.write('This is the new content!')
f.close()