Python'da metin dosyasının dosya içeriği nasıl silinir?


140

Python'da silmek istediğim metin dosyam var. Bunu nasıl yaparım?


cevapları veren insanlar bunun mümkün olmadığını söylediler .. öyleyse bana bunu python'da nasıl kolayca yapacağımı söyler misin?
Hick

Yanıtlar:


281

Python'da:

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

Veya alternatif olarak, önceden açılmış bir dosyanız varsa:

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

C ++ 'da benzer bir şey kullanabilirsiniz.


#include<fstream>ve sonra std::ofstream("file.txt");yaklaşık Python'daki kadar kısa. :)
wilhelmtell

8
Bunun çalışmasının nedeni (hem C ++ hem de python'da), varsayılan olarak bir dosyayı yazmak için açtığınızda, mevcut içeriği kesmesidir. Yani gerçekten bu bir yan etkidir ve bu nedenle gereksiz olsa bile açıklık nedenlerinden ötürü kesik () için açık çağrıyı tercih ederim.
rmeador

7
Eğer dosyayı "r +" kullanarak açtıysanız, muhtemelen sahip olduğunuz dosyayı ayrıştırdıysanız, truncate (0) kullanın. Tamamlanması için bunu yukarıdaki yanıta ekleyin!
Johan Engblom

3
işaretçiyi dosyanın başlangıcına hareket ettirmek için f.seek (0) kullanın
Johan Engblom

Okuyordum ve dosyaya yazıyordum. Cevap, dosyayı mükemmel bir şekilde kısaltır, ancak üzerine bir şey yazmak isterseniz, f.seek(0)sonra eklemeyi unutmayın f.truncate(0), aksi takdirde dosyanın başlangıcına tuhaf \ x00 ekleyebilirsiniz .
krishna chaitanya

29

Tam bir cevap değil, ondra'nın cevabının uzantısı gibi

truncate()(Tercih ettiğim yöntem) kullanırken , imlecinizin gerekli konumda olduğundan emin olun. Okumak için yeni bir dosya açıldığında - open('FILE_NAME','r')varsayılan olarak imleci 0'dadır. Ancak, dosyayı kodunuz içinde ayrıştırdıysanız, dosyanın başlangıcını tekrar gösterdiğinizden emin olun, yani truncate(0) varsayılan truncate()olarak bir dosyanın içeriğini geçerli cusror konumundan başlayarak keser.

Basit bir örnek


22

Bir dosyayı "yazma" modunda açmak onu temizler, özellikle ona yazmak zorunda değilsiniz:

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

(Dosyanın otomatik olarak kapatılmasının zamanlaması uygulamaya özel olabileceğinden kapatmalısınız)


10

Kullanıcısından alternatif bir formunu @jamylak open("filename","w").close()IS

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

8

Kullanırken with open("myfile.txt", "r+") as my_file:, myfile.txtözellikle önce dosyayı okuduğum için garip sıfırlar alıyorum. Çalışması için, önce işaretçisini ile my_filedosyanın başlangıcına değiştirmem gerekiyordu my_file.seek(0). O zaman my_file.truncate()dosyayı temizlemek için yapabilirim .


1
Bu şaşılacak bir şey değil, 3 yıl önce bu cevapta belirtilmişti .
AMC

6

Dosyanın üzerine yazmalısınız. C ++ 'da:

#include <fstream>

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

1
close()Aramaya gerek yok . Yıkıcı dosyayı kapatacaktır. Öyleyse sadece geçici bir şey oluşturmanız gerekiyor:ofstream("test.txt");
wilhelmtell

Bu soru bu cevabın ardından değişti. Belki sorunun yeni yönü verilen soruyu silersiniz?
Seanny123

1

Dosya işaretçisini programınızın içinde null değerine atamak, dosyaya yapılan bu referansı ortadan kaldıracaktır. Dosya hala orada. Sanırım remove()c'deki işlev, stdio.horada aradığınız şey. Python hakkında emin değilim.


2
BTW, hem remove () hem de unlink () normal bir dosyadaki referans sayısını azaltacak, aslında onu silmeyecek. Referans sayısı sıfıra düştüğünde dosya silinecektir. Örneğin, işleminizde dosya açıksa ve üzerinde unlink () veya remove () çağrısı yaparsanız, dosya kapanana kadar silinmez () d (yani ref sayısı sıfıra düşer - ayrıca başka hiçbir işlem yapılmadığını varsayar) dosyayı açın). Bu davranış, örneğin, anormal işlem sonlandırıldıktan sonra geçici dosyaların ortalıkta bırakılmamasını sağlamak için yararlıdır (örneğin, open (), unlink (), dosya IO gerçekleştir, CRASH , close () çağrılmamış).
Void

1

Güvenlik sizin için önemliyse, dosyayı yazmak için açıp tekrar kapatmak yeterli olmayacaktır. Bilgilerin en azından bir kısmı hala depolama cihazında olacaktır ve örneğin bir disk kurtarma programı kullanılarak bulunabilir.

Örneğin, sildiğiniz dosyanın üretim parolaları içerdiğini ve mevcut işlem tamamlandıktan hemen sonra silinmesi gerektiğini varsayalım.

Dosyayı kullanmayı bitirdikten sonra sıfır doldurmak, hassas bilgilerin yok edilmesini sağlamaya yardımcı olur.

Yakın tarihli bir projede, küçük metin dosyaları için iyi çalışan aşağıdaki kodu kullandık. Mevcut içeriğin üzerine sıfır satırları yazar.

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)

Sıfır doldurmanın güvenliğinizi garanti etmeyeceğini unutmayın. Gerçekten endişeliyseniz, sürücünüzdeki 'boş' alanı temizlemek için sıfır doldurmak ve File Shredder veya CCleaner gibi uzman bir yardımcı program kullanmak en iyisidir .


0

Sonunu silmeniz gerekmedikçe, yerinde bir dosyadan "silemezsiniz". Ya "boş" bir değerin üzerine yazılmış bir içerik olun ya da dosyanın ilgilendiğiniz kısımlarını okuyun ve başka bir dosyaya yazın.


ok anlamsız değer vermeden üzerine nasıl yazılır? Demek istediğim, 9'luk bir dizi uzunluğunun olduğunu ve bunun üzerine 6'lık dizi uzunluğuyla yazıyorum. bu 3 çöp değeri rt anlamına gelir?
Hick

Doğru. Ayrıca, herhangi bir okuyucuya bu 3 karakterin anlamsız olduğu gerçeğini tanımlamanın bir yolunu bulmanız gerekir.
Ignacio Vazquez-Abrams

gerçek şu ki kodum python ve c ++ arasında yayılmış. yani bir dosya C ++ ile okunmuşsa ve python ile dosya yazılırsa .. hem dosyanın silinmesi gerekir ..
Hick

0

Metin dosyaları sıralı olduğundan, üzerlerindeki verileri doğrudan silemezsiniz. Seçenekleriniz:

  • En yaygın yol, yeni bir dosya oluşturmaktır. Orijinal dosyadan okuyun ve silmek istediğiniz bölüm dışında her şeyi yeni dosyaya yazın. Dosyanın tamamı yazıldığında, eski dosyayı silin ve yeni dosyayı orijinal ada sahip olacak şekilde yeniden adlandırın.
  • Ayrıca değiştirmek istediğiniz noktadan itibaren dosyanın tamamını kesip yeniden yazabilirsiniz. Değiştirmek istediğinizi göstermeye çalışın ve dosyanın geri kalanını belleğe okuyun. Aynı noktaya geri dönün, dosyayı kesin ve silmek istediğiniz kısım olmadan içeriği tekrar yazın.
  • Diğer bir basit seçenek, verilerin üzerine aynı uzunlukta başka bir veri yazmaktır. Bunun için tam konumu arayın ve yeni verileri yazın. Sınırlama, aynı uzunlukta olması gerektiğidir.

Yukarıdaki fikirlerden herhangi birini uygulamak için seek/ truncatefunction / method'a bakın . Hem Python hem de C bu işlevlere sahiptir.


sadece baştan itibaren tüm dosyayı silmek istiyorum
Hick

2
Ardından dosyayı kaldırın. Python'da os.removeveya os.unlinkiçinde veya unlinkC'de kullanın . Diğer bir seçenek, dosyayı yazmak veya kullanmak için yeniden açmaktır truncate.
nosklo

0

Dosya içeriği yazma ve okuma

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

Benim için çalıştı


0

Bunu da kullanabilirsiniz (yukarıdaki cevaplardan birkaçına dayanarak):

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

Tabii ki bu, bir dosyayı temizlemenin gerçekten kötü bir yoludur çünkü çok fazla kod satırı gerektirir, ancak bunu size bu yöntemde de yapılabileceğini göstermek için yazdım.

mutlu kodlama!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.