Làm cách nào để xóa nội dung tệp của tệp văn bản trong Python?


140

Tôi có tệp văn bản mà tôi muốn xóa trong Python. Làm thế nào để làm điều đó?


những người đã đưa ra câu trả lời đã nói rằng điều đó là không thể .. vì vậy bạn có muốn cho tôi biết làm thế nào để dễ dàng làm điều đó với con trăn không?
Hick

Câu trả lời:


278

Trong trăn:

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

Hoặc cách khác, nếu bạn đã mở tệp:

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

Trong C ++, bạn có thể sử dụng một cái gì đó tương tự.


#include<fstream>và sau đó std::ofstream("file.txt");ngắn như trong Python. :)
wilmustell

8
Lý do điều này hoạt động (trong cả C ++ và python) là vì theo mặc định khi bạn mở một tệp để viết, nó cắt ngắn nội dung hiện có. Vì vậy, thực sự đó là một tác dụng phụ, và do đó tôi thích cách gọi rõ ràng hơn để cắt ngắn () vì lý do rõ ràng, mặc dù điều đó là không cần thiết.
rmeador

7
nếu bạn đã mở tệp bằng "r +", hãy sử dụng cắt ngắn (0) nếu bạn đã phân tích tệp mà bạn có thể có. Thêm điều này vào câu trả lời ở trên để hoàn thành nó!
Johan Engblom

3
sử dụng f.seek (0) để di chuyển con trỏ đến phần đầu của tệp
Johan Engblom

Tôi đã đọc cũng như viết để nộp. Câu trả lời cắt ngắn hoàn toàn tệp, nhưng hãy cẩn thận nếu bạn muốn viết lại một cái gì đó cho nó, đừng quên thêm f.seek(0)vào sau f.truncate(0), nếu không bạn sẽ có \ x00 kỳ lạ được thêm vào lúc bắt đầu tệp.
krishna chaitanya

29

Không phải là một câu trả lời đầy đủ hơn về một phần mở rộng cho câu trả lời của ondra

Khi sử dụng truncate()(phương pháp ưa thích của tôi), đảm bảo con trỏ của bạn ở vị trí cần thiết. Khi một tệp mới được mở để đọc - open('FILE_NAME','r')con trỏ của nó ở mức 0 theo mặc định. Nhưng nếu bạn đã phân tích tệp trong mã của mình, hãy đảm bảo trỏ vào đầu tệp một lần nữa, truncate(0) theo mặc định, truncate()cắt ngắn nội dung của tệp bắt đầu từ vị trí cusror hiện tại.

Một ví dụ đơn giản


21

Mở một tập tin trong chế độ "ghi" sẽ xóa nó, bạn không nhất thiết phải ghi vào nó:

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

(bạn nên đóng nó vì thời điểm khi tệp được đóng tự động có thể được triển khai cụ thể)


10

Từ người dùng @jamylak, một hình thức thay thế open("filename","w").close()

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

8

Khi sử dụng with open("myfile.txt", "r+") as my_file:, tôi nhận được số không lạ myfile.txt, đặc biệt là khi tôi đang đọc tệp đầu tiên. Để nó hoạt động, trước tiên tôi phải thay đổi con trỏ my_fileđến đầu tập tin với my_file.seek(0). Sau đó tôi có thể làm my_file.truncate()để xóa các tập tin.


1
Điều này sẽ không gây ngạc nhiên, nó đã được đề cập trong câu trả lời này 3 năm trước.
AMC

6

Bạn phải ghi đè lên tập tin. Trong C ++:

#include <fstream>

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

1
Không cần close()cuộc gọi. Hàm hủy sẽ đóng tệp. Vì vậy, bạn chỉ cần tạo tạm thời:ofstream("test.txt");
wilmustell

Câu hỏi này đã thay đổi kể từ câu trả lời này. Có thể xóa câu hỏi đưa ra hướng mới của câu hỏi?
Seanny123

1

Việc chỉ định con trỏ tệp thành null trong chương trình của bạn sẽ loại bỏ tham chiếu đó đến tệp. Các tập tin vẫn còn đó. Tôi nghĩ rằng remove()chức năng trong c stdio.hlà những gì bạn đang tìm kiếm ở đó. Không chắc chắn về Python.


2
BTW, cả remove () và unlink () sẽ làm giảm số tham chiếu trên một tệp thông thường, không thực sự xóa nó. Tập tin sẽ bị xóa sau khi số tham chiếu giảm xuống không. Ví dụ: nếu quy trình của bạn mở tệp và bạn gọi unlink () hoặc remove () trên đó, nó sẽ không bị xóa cho đến khi tệp đóng () d (tức là số lượng ref giảm xuống 0 - cũng không giả sử không có quy trình nào khác mở tệp). Hành vi này rất hữu ích, ví dụ, để đảm bảo các tệp tạm thời không bị bỏ lại sau khi chấm dứt quá trình bất thường (ví dụ: open (), unlink (), thực hiện tệp IO, CRASH , close () KHÔNG được gọi).
Vô hiệu

1

Nếu bảo mật là quan trọng đối với bạn thì mở tệp để ghi và đóng lại sẽ không đủ. Ít nhất một số thông tin sẽ vẫn còn trên thiết bị lưu trữ và có thể được tìm thấy, ví dụ, bằng cách sử dụng tiện ích khôi phục đĩa.

Giả sử, ví dụ, tệp bạn đang xóa chứa mật khẩu sản xuất và cần phải xóa ngay sau khi hoàn tất thao tác hiện tại.

Không điền vào tệp sau khi bạn sử dụng xong, nó giúp đảm bảo thông tin nhạy cảm bị hủy.

Trong một dự án gần đây, chúng tôi đã sử dụng đoạn mã sau, hoạt động tốt cho các tệp văn bản nhỏ. Nó ghi đè lên các nội dung hiện có với các dòng số không.

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)

Lưu ý rằng không điền sẽ không đảm bảo an ninh của bạn. Nếu bạn thực sự lo lắng, tốt nhất bạn nên điền vào không sử dụng tiện ích chuyên dụng như File Shredder hoặc CCleaner để xóa sạch không gian 'trống' trên ổ đĩa của bạn.


0

Bạn không thể "xóa" khỏi tệp tại chỗ trừ khi bạn cần xóa phần cuối. Có thể là nội dung với phần ghi đè của giá trị "trống" hoặc đọc các phần của tệp bạn quan tâm và ghi nó vào tệp khác.


ok làm thế nào để ghi đè lên nó mà không đưa ra giá trị rác? tôi có nghĩa là giả sử có độ dài chuỗi là 9 và tôi ghi đè lên nó với độ dài chuỗi là 6. điều đó có nghĩa là 3 giá trị rác rt?
Hick

Chính xác. Thêm vào đó, bạn sẽ phải có một số cách để xác định cho bất kỳ độc giả nào thực tế rằng 3 ký tự đó là rác.
Ignacio Vazquez-Abrams

thực tế là mã của tôi được kéo dài giữa python và c ++. vì vậy nếu một tệp đọc được thực hiện trong C ++ và tệp ghi bằng python .. cả thời gian tệp phải bị xóa ..
Hick

0

Vì các tệp văn bản là tuần tự, bạn không thể xóa dữ liệu trực tiếp trên chúng. Lựa chọn của bạn là:

  • Cách phổ biến nhất là tạo một tệp mới. Đọc từ tệp gốc và viết mọi thứ trên tệp mới, ngoại trừ phần bạn muốn xóa. Khi tất cả các tệp đã được ghi, xóa tệp cũ và đổi tên tệp mới để nó có tên gốc.
  • Bạn cũng có thể cắt bớt và viết lại toàn bộ tệp từ điểm bạn muốn thay đổi trở đi. Tìm kiếm điểm bạn muốn thay đổi và đọc phần còn lại của tệp vào bộ nhớ. Tìm kiếm trở lại cùng một điểm, cắt ngắn tệp và viết lại nội dung mà không có phần bạn muốn xóa.
  • Một tùy chọn đơn giản khác là ghi đè dữ liệu bằng một dữ liệu khác có cùng độ dài. Đối với điều đó, tìm kiếm đến vị trí chính xác và viết dữ liệu mới. Hạn chế là nó phải có cùng độ dài.

Nhìn vào seek/ truncatefunction / phương thức để thực hiện bất kỳ ý tưởng nào ở trên. Cả Python và C đều có các chức năng đó.


tôi chỉ muốn xóa toàn bộ tập tin từ đầu
Hick

2
Sau đó chỉ cần loại bỏ các tập tin. Sử dụng os.removehoặc os.unlinktrong python, hoặc unlinktrong C. Một tùy chọn khác là chỉ mở lại tệp để viết hoặc sử dụng truncate.
nosklo

0

Viết và đọc nội dung tập tin

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

Nó làm việc cho tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.