Подтвердить что ты не робот

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

У меня есть временный файл с некоторым контентом и python script, генерирующий некоторый вывод в этот файл. Я хочу, чтобы это повторялось 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()?

4b9b3361

Ответ 1

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

Ответ 2

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

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 намного лучше, чем пытаться изобрести его.

Ответ 3

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

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

Ответ 4

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