#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.
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.
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.
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
defdestroy_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.
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.
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.
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
defwriteTempFile(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
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.
Odpowiedzi:
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.
źródło
#include<fstream>
a potemstd::ofstream("file.txt");
tak krótkie jak w Pythonie. :)f.seek(0)
późniejf.truncate(0)
, w przeciwnym razie na początku pliku pojawi się dziwne \ x00.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ślnietruncate()
obcina zawartość pliku, zaczynając od bieżącej pozycji cusror.Prosty przykład
źródło
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)
źródło
Od użytkownika @jamylak alternatywną formą
open("filename","w").close()
jestwith open('filename.txt','w'): pass
źródło
Podczas używania
with open("myfile.txt", "r+") as my_file:
dostaję dziwne zeramyfile.txt
, zwłaszcza że najpierw czytam plik. Aby to zadziałało, musiałem najpierw zmienić wskaźnikmy_file
na początek pliku za pomocąmy_file.seek(0)
. Wtedy mogłem zrobić,my_file.truncate()
aby wyczyścić plik.źródło
Musisz nadpisać plik. W C ++:
#include <fstream> std::ofstream("test.txt", std::ios::out).close();
źródło
close()
dzwonienia. Destruktor zamknie plik. Musisz więc tylko utworzyć tymczasowy:ofstream("test.txt");
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 cstdio.h
jest tym, czego tam szukasz. Nie jestem pewien co do Pythona.źródło
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.
źródło
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.
źródło
Ponieważ pliki tekstowe są sekwencyjne, nie można bezpośrednio usuwać z nich danych. Twoje opcje to:
Spójrz na
seek
/truncate
function / method, aby wdrożyć którykolwiek z powyższych pomysłów. Funkcje te mają zarówno Python, jak i C.źródło
os.remove
lubos.unlink
w pythonie lubunlink
w C. Inną opcją jest ponowne otwarcie pliku do zapisu lub użyciatruncate
.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
źródło
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!
źródło