Jak usunąć zawartość pliku tekstowego w Pythonie?

148

Mam plik tekstowy, który chcę usunąć w Pythonie. Jak mogę to zrobić?

Chłop
źródło
osoby, które udzieliły odpowiedzi, powiedziały, że nie jest to możliwe ... więc czy chcesz mi powiedzieć, jak łatwo to zrobić w Pythonie?
Hick

Odpowiedzi:

298

W Pythonie:

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

Lub alternatywnie, jeśli masz już otwarty plik:

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

W C ++ możesz użyć czegoś podobnego.

ondra
źródło
#include<fstream>a potem std::ofstream("file.txt");tak krótkie jak w Pythonie. :)
wilhelmtell
9
Powodem, dla którego to działa (zarówno w C ++, jak i Pythonie) jest to, że domyślnie po otwarciu pliku do zapisu obcina on istniejącą zawartość. Więc naprawdę jest to efekt uboczny, dlatego wolałbym jawne wywołanie truncate () ze względu na przejrzystość, nawet jeśli jest to niepotrzebne.
rmeador
7
jeśli otworzyłeś plik za pomocą "r +", użyj truncate (0), jeśli masz sparsowany plik, który prawdopodobnie masz. Dodaj to do powyższej odpowiedzi, aby była kompletna!
Johan Engblom
3
użyj f.seek (0), aby przenieść wskaźnik na początek pliku
Johan Engblom
4
Czytałem i pisałem do pliku. Odpowiedź idealnie obcina plik, ale uważaj, jeśli chcesz coś do niego zapisać, nie zapomnij dodać f.seek(0)później f.truncate(0), w przeciwnym razie na początku pliku pojawi się dziwne \ x00.
krishna chaitanya
31

Nie jest to pełna odpowiedź, a raczej rozszerzenie odpowiedzi ondry

Korzystając z truncate()(mojej preferowanej metody), upewnij się, że kursor znajduje się w wymaganej pozycji. Gdy nowy plik jest otwierany do odczytu - open('FILE_NAME','r')jego kursor jest domyślnie ustawiony na 0. Ale jeśli przeanalizowałeś plik w swoim kodzie, upewnij się, że ponownie wskazałeś początek pliku, tj. truncate(0) Domyślnie truncate()obcina zawartość pliku, zaczynając od bieżącej pozycji cusror.

Prosty przykład

Snigdha Batra
źródło
26

Otwarcie pliku w trybie „zapisu” usuwa go, nie musisz specjalnie do niego pisać:

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

(należy go zamknąć, ponieważ czas automatycznego zamykania pliku może zależeć od implementacji)

Douglas Leeder
źródło
11

Od użytkownika @jamylak alternatywną formą open("filename","w").close()jest

with open('filename.txt','w'): pass
CasualCoder3
źródło
8

Podczas używania with open("myfile.txt", "r+") as my_file:dostaję dziwne zera myfile.txt, zwłaszcza że najpierw czytam plik. Aby to zadziałało, musiałem najpierw zmienić wskaźnik my_filena początek pliku za pomocą my_file.seek(0). Wtedy mogłem zrobić, my_file.truncate()aby wyczyścić plik.

wcyn
źródło
1
Nie powinno to dziwić, wspomniano o tym w tej odpowiedzi 3 lata wcześniej.
AMC
6

Musisz nadpisać plik. W C ++:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();
Alex Korban
źródło
1
Nie ma potrzeby close()dzwonienia. Destruktor zamknie plik. Musisz więc tylko utworzyć tymczasowy:ofstream("test.txt");
wilhelmtell
To pytanie zmieniło się od czasu tej odpowiedzi. Może usunąć pytanie, biorąc pod uwagę nowy kierunek pytania?
Seanny123
1

Przypisanie wskaźnika pliku do wartości null w programie po prostu pozbędzie się tego odniesienia do pliku. Plik nadal tam jest. Myślę, że remove()funkcja w c stdio.hjest tym, czego tam szukasz. Nie jestem pewien co do Pythona.

bsberry
źródło
2
Swoją drogą, zarówno remove (), jak i unlink () zmniejszą liczbę odwołań do zwykłego pliku, a nie usuwają go. Plik zostanie usunięty, gdy liczba odwołań spadnie do zera. Na przykład, jeśli twój proces ma otwarty plik i wywołasz na nim unlink () lub remove (), nie zostanie on usunięty, dopóki plik nie zostanie zamknięty () d (tj. Liczba ref spadnie do zera - również zakłada brak innych procesów otworzyć plik). To zachowanie jest przydatne, na przykład, w celu zapewnienia, że ​​pliki tymczasowe nie zostaną pozostawione po nieprawidłowym zakończeniu procesu (np. Open (), unlink (), wykonanie operacji IO, CRASH , close () NOT wywołane).
Nieważne
1

Jeśli bezpieczeństwo jest dla Ciebie ważne, otwarcie pliku do zapisu i ponowne zamknięcie go nie wystarczy. Przynajmniej część informacji będzie nadal znajdować się na urządzeniu magazynującym i można je będzie znaleźć, na przykład, za pomocą narzędzia do odzyskiwania dysków.

Załóżmy na przykład, że usuwany plik zawiera hasła produkcyjne i musi zostać usunięty natychmiast po zakończeniu bieżącej operacji.

Wypełnianie pliku zerami po zakończeniu korzystania z niego pomaga zapewnić zniszczenie poufnych informacji.

W ostatnim projekcie użyliśmy następującego kodu, który działa dobrze w przypadku małych plików tekstowych. Zastępuje istniejącą zawartość liniami zer.

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)

Pamiętaj, że napełnianie zerowe nie gwarantuje bezpieczeństwa. Jeśli naprawdę się martwisz, najlepiej zapełnij zero i użyj specjalistycznego narzędzia, takiego jak File Shredder lub CCleaner, aby wyczyścić `` puste '' miejsce na dysku.

Nacięcie
źródło
0

Nie można „wymazać” z pliku na miejscu, chyba że trzeba usunąć koniec. Albo bądź zadowolony z zastąpienia „pustej” wartości, albo przeczytaj części pliku, na których Ci zależy i zapisz je w innym pliku.

Ignacio Vazquez-Abrams
źródło
ok, jak to nadpisać bez podawania wartości śmieci? mam na myśli, załóżmy, że istnieje ciąg o długości 9 i nadpisuję go ciągiem o długości 6. to oznaczałoby 3 wartości śmieci rt?
Hick
Poprawny. Dodatkowo musiałbyś mieć jakiś sposób na zidentyfikowanie dla każdego czytelnika faktu, że te 3 znaki to śmieci.
Ignacio Vazquez-Abrams
Faktem jest, że mój kod jest podzielony między Pythona i C ++. więc jeśli odczyt pliku jest wykonywany w C ++ i zapis pliku w Pythonie… zarówno czas, w którym plik ma zostać usunięty ..
Hick
0

Ponieważ pliki tekstowe są sekwencyjne, nie można bezpośrednio usuwać z nich danych. Twoje opcje to:

  • Najpopularniejszym sposobem jest utworzenie nowego pliku. Odczytaj z oryginalnego pliku i zapisz wszystko w nowym pliku, z wyjątkiem części, którą chcesz usunąć. Po zapisaniu całego pliku usuń stary plik i zmień nazwę nowego pliku, tak aby miał oryginalną nazwę.
  • Możesz także skrócić i przepisać cały plik od miejsca, w którym chcesz zmienić. Poszukaj punktu, który chcesz zmienić, i przeczytaj resztę pliku do pamięci. Wróć do tego samego punktu, skróć plik i zapisz zawartość bez części, którą chcesz usunąć.
  • Inną prostą opcją jest nadpisanie danych innymi danymi o tej samej długości. W tym celu znajdź dokładną pozycję i zapisz nowe dane. Ograniczeniem jest to, że musi mieć dokładnie taką samą długość.

Spójrz na seek/ truncatefunction / method, aby wdrożyć którykolwiek z powyższych pomysłów. Funkcje te mają zarówno Python, jak i C.

nosklo
źródło
Chcę tylko skasować cały plik od początku
Hick
2
Następnie po prostu usuń plik. Użyj os.removelub os.unlinkw pythonie lub unlinkw C. Inną opcją jest ponowne otwarcie pliku do zapisu lub użycia truncate.
nosklo
0

Pisanie i czytanie zawartości plików

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

U mnie zadziałało

Mohd Tauovir Khan
źródło
0

Możesz również użyć tego (na podstawie kilku z powyższych odpowiedzi):

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

oczywiście jest to naprawdę zły sposób na wyczyszczenie pliku, ponieważ wymaga tak wielu wierszy kodu, ale napisałem to, aby pokazać, że można to zrobić również w tej metodzie.

miłego kodowania!

sujay simha
źródło