Як стерти вміст файлу текстового файлу в Python?


140

У мене є текстовий файл, який я хочу стерти в Python. Як це зробити?


люди, які дали відповіді, сказали, що це неможливо .. тож ви хочете сказати мені, як легко це зробити в python?
Хік

Відповіді:


280

У пітоні:

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) в тому, що за замовчуванням, коли ви відкриваєте файл для запису, він скорочує наявний вміст. Так що це справді побічний ефект, і тому я вважаю за краще чіткий заклик урізати () з ясності, хоча це і не потрібно.
rmeador

7
якщо ви відкрили файл за допомогою "r +", використовуйте усікання (0), якщо ви розібрали файл, який, ймовірно, є. Додайте це до відповіді вище, щоб вона була повною!
Йохан Енгблом

3
використовуйте f.seek (0) для переміщення вказівника на початок файлу
Йоган Енгблом

Я читав, а також писав у файл. Відповідь прекрасно обрізає файл, але будьте обережні, якщо ви хочете знову щось написати до нього, не забудьте додати f.seek(0)після цього f.truncate(0), інакше у вас буде додано дивне \ x00 додане на початку файлу.
кришна чайтанья

29

Не повна відповідь, а більше розширення до відповіді ondra

Під час використання truncate()(мій кращий метод) переконайтесь, що ваш курсор знаходиться у потрібному положенні. Коли для читання відкривається новий файл - open('FILE_NAME','r')курсор за замовчуванням знаходиться у 0. Але якщо ви проаналізували файл у своєму коді, переконайтеся, що вкажіть на початку файлу ще раз, тобто truncate(0) за замовчуванням truncate()обрізає вміст файлу, починаючи з поточної позиції cusror.

Простий приклад


21

Відкриття файлу в режимі "запис" очищає його, не потрібно спеціально його писати:

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

(ви повинні закрити його, оскільки час, коли файл автоматично закриється, може бути специфічним для реалізації)


10

Від користувача @jamylak альтернативною формою open("filename","w").close()є

with open('filename.txt','w'): pass

8

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


1
Це не повинно дивуватися, про це було сказано у цій відповіді 3 роки раніше.
AMC

6

Ви повинні перезаписати файл. В C ++:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();

1
У close()дзвінку немає потреби . Деструктор закриє файл. Тож вам просто потрібно створити тимчасовий:ofstream("test.txt");
wilhelmtell

Це питання змінилося з моменту цієї відповіді. Можливо, видаліть питання, враховуючи новий напрямок запитання?
Seanny123

1

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


2
BTW, і видалити (), і від’єднати () зменшить кількість посилань на звичайний файл, а не видалить його фактично. Файл буде стертий, коли кількість посилань знизиться до нуля. Наприклад, якщо у вашому процесі відкритий файл і ви викликаєте unlink () або видалення () на ньому, він не буде видалений, поки файл не закриється () d (тобто кількість посилань опускається до нуля - також не передбачає інших процесів відкрити файл). Така поведінка корисна, наприклад, для того, щоб тимчасові файли не залишилися після ненормального завершення процесу (наприклад, відкрити (), від’єднати зв'язок (), виконати IO файлу, CRASH , close () НЕ викликається).
Недійсний

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?
Хік

Правильно. Плюс до того, ви повинні мати якийсь спосіб визначити будь-якого читача про те, що ці 3 символи - сміття.
Ігнасіо Васкес-Абрамс

факт мій код перебуває між python та c ++. тож, якщо читання файлу робиться на C ++, а запис у python .. обидва рази слід видалити файл ..
Хік

0

Оскільки текстові файли є послідовними, ви не можете безпосередньо стерти дані з них. Ваші варіанти:

  • Найпоширеніший спосіб - це створити новий файл. Читайте з оригінального файлу і записуйте все в новий файл, крім тієї частини, яку потрібно видалити. Коли весь файл буде записаний, видаліть старий файл та перейменуйте новий файл, щоб він мав оригінальну назву.
  • Ви також можете усікати і переписати весь файл з точки, яку ви хочете змінити. Спробуйте вказати, що хочете змінити, і прочитайте решту файлів у пам'яті. Поверніться до тієї ж точки, усічіть файл і запишіть вміст без тієї частини, яку ви хочете стерти.
  • Ще один простий варіант - перезаписати дані іншими даними однакової довжини. Для цього домагайтесь точної позиції та запишіть нові дані. Обмеження полягає в тому, що він повинен мати точно таку ж довжину.

Подивіться на seek/ truncateфункцію / метод для втілення будь-якої з вищезазначених ідей. І Python, і C виконують ці функції.


Я просто хочу стерти весь файл з самого початку
Хік

2
Потім просто видаліть файл. Використовуйте os.removeабо os.unlinkв python, або unlinkв C. Інший варіант - просто відкрити файл для запису чи використання truncate.
nosklo

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

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

щасливе кодування!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.