จะลบเนื้อหาไฟล์ของไฟล์ข้อความใน Python ได้อย่างไร?


148

ฉันมีไฟล์ข้อความที่ต้องการลบใน Python ฉันจะทำอย่างไร


คนที่ให้คำตอบได้บอกว่าเป็นไปไม่ได้ .. งั้นช่วยบอกวิธีง่ายๆใน python หน่อยได้ไหม?
ฮิ

คำตอบ:


298

ในหลาม:

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

9
สาเหตุที่ใช้งานได้ (ทั้งใน C ++ และ python) เป็นเพราะโดยค่าเริ่มต้นเมื่อคุณเปิดไฟล์เพื่อเขียนมันจะตัดเนื้อหาที่มีอยู่ให้สั้นลง ดังนั้นมันจึงเป็นผลข้างเคียงดังนั้นฉันจึงต้องการการเรียกที่ชัดเจนเพื่อตัดทอน () เพื่อเหตุผลที่ชัดเจนแม้ว่าจะไม่จำเป็นก็ตาม
rmeador

7
หากคุณเปิดไฟล์โดยใช้ "r +" ให้ใช้การตัดทอน (0) หากคุณมีไฟล์ที่แยกวิเคราะห์ซึ่งคุณน่าจะมี เพิ่มสิ่งนี้ในคำตอบด้านบนเพื่อให้เสร็จสมบูรณ์!
Johan Engblom

3
ใช้ f.seek (0) เพื่อย้ายตัวชี้ไปที่จุดเริ่มต้นของไฟล์
Johan Engblom

4
ฉันกำลังอ่านและเขียนลงไฟล์ คำตอบจะตัดทอนไฟล์อย่างสมบูรณ์แบบ แต่ระวังถ้าคุณต้องการเขียนอะไรลงไปอีกอย่าลืมเพิ่มf.seek(0)หลังจากนั้นไม่f.truncate(0)เช่นนั้นคุณจะมี \ x00 แปลก ๆ ต่อท้ายไฟล์
krishna chaitanya

31

ไม่ใช่คำตอบที่สมบูรณ์ของส่วนขยายเพิ่มเติมสำหรับคำตอบของ ondra

เมื่อใช้truncate()(วิธีที่ฉันต้องการ) ตรวจสอบให้แน่ใจว่าเคอร์เซอร์ของคุณอยู่ในตำแหน่งที่ต้องการ เมื่อเปิดไฟล์ใหม่เพื่ออ่านopen('FILE_NAME','r')เคอร์เซอร์จะอยู่ที่ 0 ตามค่าเริ่มต้น แต่ถ้าคุณแยกวิเคราะห์ไฟล์ภายในโค้ดของคุณแล้วอย่าลืมชี้ที่จุดเริ่มต้นของไฟล์อีกครั้งนั่นคือtruncate(0) โดยค่าเริ่มต้นจะtruncate()ตัดเนื้อหาของไฟล์โดยเริ่มจากตำแหน่ง cusror ปัจจุบัน

ตัวอย่างง่ายๆ


26

การเปิดไฟล์ในโหมด "เขียน" จะเป็นการล้างข้อมูลคุณไม่จำเป็นต้องเขียนโดยเฉพาะ:

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

(คุณควรปิดเนื่องจากเป็นช่วงเวลาที่ไฟล์ถูกปิดโดยอัตโนมัติอาจเป็นการใช้งานเฉพาะ)



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

การกำหนดตัวชี้ไฟล์เป็น null ภายในโปรแกรมของคุณจะเป็นการกำจัดการอ้างอิงนั้นไปยังไฟล์ ไฟล์ยังอยู่ที่นั่น ฉันคิดว่าremove()ฟังก์ชันใน c stdio.hคือสิ่งที่คุณกำลังมองหาที่นั่น ไม่แน่ใจเกี่ยวกับ Python


2
BTW ทั้งลบ () และยกเลิกการลิงก์ () จะลดจำนวนการอ้างอิงในไฟล์ปกติไม่ใช่ลบจริง ไฟล์จะถูกลบเมื่อจำนวนอ้างอิงลดลงเหลือศูนย์ ตัวอย่างเช่นหากกระบวนการของคุณมีไฟล์เปิดอยู่และคุณเรียกยกเลิกการลิงก์ () หรือลบ () บนไฟล์จะไม่ถูกลบจนกว่าไฟล์จะปิด () d (เช่นจำนวนการอ้างอิงลดลงเป็นศูนย์ - ยังถือว่าไม่มีกระบวนการอื่น ๆ เปิดไฟล์) ลักษณะการทำงานนี้มีประโยชน์ตัวอย่างเช่นเพื่อให้แน่ใจว่าไฟล์ชั่วคราวจะไม่ถูกทิ้งไว้หลังจากการยุติกระบวนการที่ผิดปกติ (เช่นเปิด (), ยกเลิกการลิงก์ (), ดำเนินการไฟล์ IO, CRASH , ปิด () ไม่เรียก)
เป็นโมฆะ

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 นั้นเป็นขยะ
Ignacio Vazquez-Abrams

ความจริงก็คือรหัสของฉันถูกขยายระหว่าง python และ c ++ ดังนั้นหากการอ่านไฟล์เสร็จสิ้นใน C ++ และไฟล์เขียนด้วย python .. ทั้งเวลาที่ไฟล์ต้องถูกลบ ..
ฮิ

0

เนื่องจากไฟล์ข้อความเป็นไฟล์ตามลำดับคุณจึงไม่สามารถลบข้อมูลในไฟล์ได้โดยตรง ตัวเลือกของคุณคือ:

  • วิธีที่ใช้บ่อยที่สุดคือการสร้างไฟล์ใหม่ อ่านจากไฟล์ต้นฉบับและเขียนทุกอย่างในไฟล์ใหม่ยกเว้นส่วนที่คุณต้องการลบ เมื่อเขียนไฟล์ทั้งหมดแล้วให้ลบไฟล์เก่าและเปลี่ยนชื่อไฟล์ใหม่เพื่อให้มีชื่อเดิม
  • คุณยังสามารถตัดทอนและเขียนใหม่ทั้งไฟล์ได้ตั้งแต่จุดที่คุณต้องการเปลี่ยนแปลงเป็นต้นไป ค้นหาจุดที่คุณต้องการเปลี่ยนแปลงและอ่านไฟล์ที่เหลือไปยังหน่วยความจำ กลับไปที่จุดเดิมตัดทอนไฟล์และเขียนเนื้อหากลับโดยไม่มีส่วนที่คุณต้องการลบ
  • อีกทางเลือกง่ายๆคือการเขียนทับข้อมูลด้วยข้อมูลอื่นที่มีความยาวเท่ากัน สำหรับสิ่งนั้นให้ค้นหาตำแหน่งที่แน่นอนและเขียนข้อมูลใหม่ ข้อ จำกัด คือต้องมีความยาวเท่ากันแน่นอน

ดูที่seek/ truncatefunction / method เพื่อนำแนวคิดข้างต้นไปใช้ ทั้ง Python และ C มีฟังก์ชันเหล่านั้น


ฉันแค่ต้องการลบไฟล์ทั้งหมดตั้งแต่ต้น
ฮิ

2
จากนั้นเพียงแค่ลบไฟล์ การใช้งานos.removeหรือos.unlinkในหลามหรือ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()

แน่นอนว่านี่เป็นวิธีที่แย่มากในการล้างไฟล์เนื่องจากต้องใช้โค้ดหลายบรรทัด แต่ฉันเพิ่งเขียนสิ่งนี้เพื่อแสดงให้คุณเห็นว่าสามารถทำได้ในวิธีนี้เช่นกัน

มีความสุขในการเขียนโค้ด!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.