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