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

140

У меня есть текстовый файл, который я хочу стереть в Python. Как я могу это сделать?

деревенщина
источник
люди, которые дали ответы, сказали, что это невозможно ... так что вы хотите сказать мне, как легко это сделать в python?
Hick

Ответы:

281

В питоне:

open('file.txt', 'w').close()

Или, если у вас уже есть открытый файл:

f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

В C ++ вы можете использовать нечто подобное.

Ондра
источник
#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()обрезает содержимое файла, начиная с текущей позиции ошибки.

Простой пример

Снигдха Батра
источник
22

Открытие файла в режиме «запись» очищает его, вам не нужно специально писать в него:

open("filename", "w").close()

(вы должны закрыть его, так как время, когда файл закрывается автоматически, может зависеть от реализации)

Дуглас Лидер
источник
10

От пользователя @jamylak альтернативной формой open("filename","w").close()является

with open('filename.txt','w'): pass
CasualCoder3
источник
8

При использовании with open("myfile.txt", "r+") as my_file:получаются странные нули myfile.txt, тем более что сначала читаю файл. Чтобы он заработал, мне пришлось сначала изменить указатель my_fileна начало файла с помощью my_file.seek(0). Тогда я смог my_file.truncate()бы очистить файл.

wcyn
источник
1
Это не должно вызывать удивления, это было упомянуто в этом ответе 3 года назад.
AMC
6

Вы должны перезаписать файл. В C ++:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();
Алекс Корбан
источник
1
close()Звонок не нужен . Деструктор закроет файл. Так что вам просто нужно создать временный:ofstream("test.txt");
Вильгельмтелл
Этот вопрос изменился после этого ответа. Может быть, удалить вопрос, учитывая новую направленность вопроса?
Seanny123
1

Назначение нулевого указателя файла внутри вашей программы просто избавит от этой ссылки на файл. Файл все еще там. Я думаю, что remove()функция в c stdio.h- это то, что вы там ищете. Не уверен насчет Python.

bsberry
источник
2
Кстати, и 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, чтобы очистить «пустое» пространство на вашем диске.

Ник
источник
0

Вы не можете «стереть» файл на месте, если вам не нужно стереть конец. Либо довольствуйтесь перезаписью «пустого» значения, либо прочтите части файла, которые вам интересны, и запишите их в другой файл.

Игнасио Васкес-Абрамс
источник
хорошо, как его перезаписать, не давая значения мусора? Я имею в виду, предположим, что длина строки 9, и я перезаписываю ее длиной строки 6. что означало бы 3 мусорных значения rt?
Hick
Верный. Кроме того, вам нужно будет каким-то образом определить для любого читателя тот факт, что эти 3 символа - мусор.
Игнасио Васкес-Абрамс
Дело в том, что мой код находится между Python и C ++. поэтому, если чтение файла выполняется на C ++, а запись файла - на python ... и время, и время, когда файл должен быть удален ..
Хик,
0

Поскольку текстовые файлы являются последовательными, вы не можете напрямую стереть данные с них. Ваши варианты:

  • Самый распространенный способ - создать новый файл. Прочтите из исходного файла и запишите все в новом файле, кроме той части, которую вы хотите удалить. Когда весь файл будет записан, удалите старый файл и переименуйте новый файл, чтобы он имел исходное имя.
  • Вы также можете обрезать и переписать весь файл, начиная с того места, которое хотите изменить. Найдите точку, которую вы хотите изменить, и прочитайте остальную часть файла в памяти. Вернитесь к той же точке, обрежьте файл и запишите содержимое без той части, которую хотите стереть.
  • Другой простой вариант - перезаписать данные другими данными той же длины. Для этого найдите точное место и запишите новые данные. Ограничение в том, что он должен иметь одинаковую длину.

Посмотрите на метод seek/ truncatefunction /, чтобы реализовать любую из вышеперечисленных идей. И Python, и C имеют эти функции.

nosklo
источник
Я просто хочу стереть весь файл с самого начала
Хик
2
Тогда просто удалите файл. Используйте os.removeили os.unlinkв python, или unlinkв C. Другой вариант - просто повторно открыть файл для записи или использования truncate.
носкло
0

Запись и чтение содержимого файла

def writeTempFile(text = ''):
    filePath = "/temp/file1.txt"
    if not 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 file
        return text

Это сработало для меня

Мохд Тауовир Хан
источник
0

Вы также можете использовать это (на основе нескольких из приведенных выше ответов):

file = open('filename.txt', 'w')
file.write('')
file.close

конечно, это действительно плохой способ очистить файл, потому что для этого требуется очень много строк кода, но я просто написал это, чтобы показать вам, что это можно сделать и этим методом.

счастливого кодирования!

Суджай Симха
источник