Как удалить только содержимое файла в Python

у меня есть временный файл с некоторым содержимым и скрипт 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 ответов


Как удалить только содержимое файла в 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 exit of the context manager

Я думаю, что проще всего просто открыть файл в режиме записи, а затем закрыть его. Например, если ваш файл 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()

что может быть проще, чем что-то вроде этого:

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 секунды на моей непримечательной машине. Каждый временный файл всего создается и удаляется по мере открытия и закрытия контекстного менеджера в этом случае. Это быстрая, безопасная и кросс-платформа.

С помощью tempfile намного лучше, чем пытаться изобрести его.


вы можете сделать это:

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