#include<fstream>а потом std::ofstream("file.txt");примерно такой же короткий, как в Python. :)
wilhelmtell
8
причина, по которой это работает (как в C ++, так и в python), заключается в том, что по умолчанию при открытии файла для записи он усекает существующее содержимое. Так что на самом деле это своего рода побочный эффект, и поэтому я бы предпочел явный вызов truncate () для ясности, хотя это и не нужно.
rmeador
7
если вы открыли файл с помощью «r +», используйте truncate (0), если вы проанализировали файл, который у вас, вероятно, есть. Добавьте это к ответу выше, чтобы закончить!
Йохан Энгблом
3
используйте f.seek (0), чтобы переместить указатель на начало файла
Йохан Энгблом,
Я читал и записывал в файл. Ответ прекрасно усекает файл, но будьте осторожны, если вы хотите что-то записать в него снова, не забудьте добавить f.seek(0)после f.truncate(0), иначе у вас будет странный \ x00, добавленный в начале файла.
Кришна Чайтанья
29
Не полный ответ, а скорее продолжение ответа Ондры
При использовании truncate()(мой предпочтительный метод) убедитесь, что курсор находится в нужной позиции. Когда новый файл открывается для чтения - open('FILE_NAME','r')его курсор по умолчанию равен 0. Но если вы проанализировали файл в своем коде, убедитесь, что он снова указывал на начало файла, т.е. truncate(0)
по умолчанию truncate()обрезает содержимое файла, начиная с текущей позиции ошибки.
При использовании with open("myfile.txt", "r+") as my_file:получаются странные нули myfile.txt, тем более что сначала читаю файл. Чтобы он заработал, мне пришлось сначала изменить указатель my_fileна начало файла с помощью my_file.seek(0). Тогда я смог my_file.truncate()бы очистить файл.
close()Звонок не нужен . Деструктор закроет файл. Так что вам просто нужно создать временный:ofstream("test.txt");
Вильгельмтелл
Этот вопрос изменился после этого ответа. Может быть, удалить вопрос, учитывая новую направленность вопроса?
Seanny123
1
Назначение нулевого указателя файла внутри вашей программы просто избавит от этой ссылки на файл. Файл все еще там. Я думаю, что remove()функция в c stdio.h- это то, что вы там ищете. Не уверен насчет Python.
Кстати, и remove (), и unlink () уменьшат количество ссылок на обычный файл, а не фактически сотрут его. Файл будет удален, когда счетчик ссылок упадет до нуля. Например, если в вашем процессе файл открыт, и вы вызываете для него unlink () или remove (), он не будет удален, пока файл не будет close () d (т.е. счетчик ссылок упадет до нуля - также предполагается, что другие процессы открыть файл). Такое поведение полезно, например, чтобы гарантировать, что временные файлы не останутся после аварийного завершения процесса (например, open (), unlink (), выполнить ввод-вывод файла, CRASH , close () НЕ вызывается).
Void
1
Если для вас важна безопасность, то открытия файла для записи и его повторного закрытия будет недостаточно. По крайней мере, часть информации все еще будет на устройстве хранения, и ее можно будет найти, например, с помощью утилиты восстановления диска.
Предположим, например, что удаляемый файл содержит производственные пароли и его необходимо удалить сразу после завершения текущей операции.
Обнуление файла после того, как вы закончили его использовать, помогает обеспечить уничтожение конфиденциальной информации.
В недавнем проекте мы использовали следующий код, который хорошо работает с небольшими текстовыми файлами. Он заменяет существующее содержимое строками нулей.
import os
def destroy_password_file(password_filename):with open(password_filename)as password_file:
text = password_file.read()
lentext = len(text)
zero_fill_line_length =40
zero_fill =['0'* zero_fill_line_length
for _
in range(lentext // zero_fill_line_length +1)]
zero_fill = os.linesep.join(zero_fill)with open(password_filename,'w')as password_file:
password_file.write(zero_fill)
Учтите, что обнуление не гарантирует вашей безопасности. Если вы действительно обеспокоены, вам лучше всего обнулить и использовать специальную утилиту, такую как File Shredder или CCleaner, чтобы очистить «пустое» пространство на вашем диске.
Вы не можете «стереть» файл на месте, если вам не нужно стереть конец. Либо довольствуйтесь перезаписью «пустого» значения, либо прочтите части файла, которые вам интересны, и запишите их в другой файл.
хорошо, как его перезаписать, не давая значения мусора? Я имею в виду, предположим, что длина строки 9, и я перезаписываю ее длиной строки 6. что означало бы 3 мусорных значения rt?
Hick
Верный. Кроме того, вам нужно будет каким-то образом определить для любого читателя тот факт, что эти 3 символа - мусор.
Игнасио Васкес-Абрамс
Дело в том, что мой код находится между Python и C ++. поэтому, если чтение файла выполняется на C ++, а запись файла - на python ... и время, и время, когда файл должен быть удален ..
Хик,
0
Поскольку текстовые файлы являются последовательными, вы не можете напрямую стереть данные с них. Ваши варианты:
Самый распространенный способ - создать новый файл. Прочтите из исходного файла и запишите все в новом файле, кроме той части, которую вы хотите удалить. Когда весь файл будет записан, удалите старый файл и переименуйте новый файл, чтобы он имел исходное имя.
Вы также можете обрезать и переписать весь файл, начиная с того места, которое хотите изменить. Найдите точку, которую вы хотите изменить, и прочитайте остальную часть файла в памяти. Вернитесь к той же точке, обрежьте файл и запишите содержимое без той части, которую хотите стереть.
Другой простой вариант - перезаписать данные другими данными той же длины. Для этого найдите точное место и запишите новые данные. Ограничение в том, что он должен иметь одинаковую длину.
Посмотрите на метод seek/ truncatefunction /, чтобы реализовать любую из вышеперечисленных идей. И Python, и C имеют эти функции.
Тогда просто удалите файл. Используйте os.removeили os.unlinkв python, или unlinkв C. Другой вариант - просто повторно открыть файл для записи или использования truncate.
носкло
0
Запись и чтение содержимого файла
def writeTempFile(text =''):
filePath ="/temp/file1.txt"ifnot text:# If blank return file content
f = open(filePath,"r")
slug = f.read()return slug
else:
f = open(filePath,"a")# Create a blank file
f.seek(0)# sets point at the beginning of the file
f.truncate()# Clear previous content
f.write(text)# Write file
f.close()# Close filereturn text
конечно, это действительно плохой способ очистить файл, потому что для этого требуется очень много строк кода, но я просто написал это, чтобы показать вам, что это можно сделать и этим методом.
Ответы:
В питоне:
Или, если у вас уже есть открытый файл:
В C ++ вы можете использовать нечто подобное.
источник
#include<fstream>
а потомstd::ofstream("file.txt");
примерно такой же короткий, как в Python. :)f.seek(0)
послеf.truncate(0)
, иначе у вас будет странный \ x00, добавленный в начале файла.Не полный ответ, а скорее продолжение ответа Ондры
При использовании
truncate()
(мой предпочтительный метод) убедитесь, что курсор находится в нужной позиции. Когда новый файл открывается для чтения -open('FILE_NAME','r')
его курсор по умолчанию равен 0. Но если вы проанализировали файл в своем коде, убедитесь, что он снова указывал на начало файла, т.е.truncate(0)
по умолчаниюtruncate()
обрезает содержимое файла, начиная с текущей позиции ошибки.Простой пример
источник
Открытие файла в режиме «запись» очищает его, вам не нужно специально писать в него:
(вы должны закрыть его, так как время, когда файл закрывается автоматически, может зависеть от реализации)
источник
От пользователя @jamylak альтернативной формой
open("filename","w").close()
являетсяисточник
При использовании
with open("myfile.txt", "r+") as my_file:
получаются странные нулиmyfile.txt
, тем более что сначала читаю файл. Чтобы он заработал, мне пришлось сначала изменить указательmy_file
на начало файла с помощьюmy_file.seek(0)
. Тогда я смогmy_file.truncate()
бы очистить файл.источник
Вы должны перезаписать файл. В C ++:
источник
close()
Звонок не нужен . Деструктор закроет файл. Так что вам просто нужно создать временный:ofstream("test.txt");
Назначение нулевого указателя файла внутри вашей программы просто избавит от этой ссылки на файл. Файл все еще там. Я думаю, что
remove()
функция в cstdio.h
- это то, что вы там ищете. Не уверен насчет Python.источник
Если для вас важна безопасность, то открытия файла для записи и его повторного закрытия будет недостаточно. По крайней мере, часть информации все еще будет на устройстве хранения, и ее можно будет найти, например, с помощью утилиты восстановления диска.
Предположим, например, что удаляемый файл содержит производственные пароли и его необходимо удалить сразу после завершения текущей операции.
Обнуление файла после того, как вы закончили его использовать, помогает обеспечить уничтожение конфиденциальной информации.
В недавнем проекте мы использовали следующий код, который хорошо работает с небольшими текстовыми файлами. Он заменяет существующее содержимое строками нулей.
Учтите, что обнуление не гарантирует вашей безопасности. Если вы действительно обеспокоены, вам лучше всего обнулить и использовать специальную утилиту, такую как File Shredder или CCleaner, чтобы очистить «пустое» пространство на вашем диске.
источник
Вы не можете «стереть» файл на месте, если вам не нужно стереть конец. Либо довольствуйтесь перезаписью «пустого» значения, либо прочтите части файла, которые вам интересны, и запишите их в другой файл.
источник
Поскольку текстовые файлы являются последовательными, вы не можете напрямую стереть данные с них. Ваши варианты:
Посмотрите на метод
seek
/truncate
function /, чтобы реализовать любую из вышеперечисленных идей. И Python, и C имеют эти функции.источник
os.remove
илиos.unlink
в python, илиunlink
в C. Другой вариант - просто повторно открыть файл для записи или использованияtruncate
.Запись и чтение содержимого файла
Это сработало для меня
источник
Вы также можете использовать это (на основе нескольких из приведенных выше ответов):
конечно, это действительно плохой способ очистить файл, потому что для этого требуется очень много строк кода, но я просто написал это, чтобы показать вам, что это можно сделать и этим методом.
счастливого кодирования!
источник