【问题标题】:How to erase the file contents of text file in Python?如何在 Python 中擦除文本文件的文件内容?
【发布时间】:2010-05-04 21:21:06
【问题描述】:

我有想要在 Python 中擦除的文本文件。我该怎么做?

【问题讨论】:

    标签: python


    【解决方案1】:

    在python中:

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

    或者,如果您已经打开了文件:

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

    【讨论】:

    • #include<fstream> 然后 std::ofstream("file.txt"); 与 Python 中的一样短。 :)
    • 之所以有效(在 C++ 和 python 中)是因为默认情况下,当您打开文件进行写入时,它会截断现有内容。所以这确实是一种副作用,因此为了清楚起见,我更喜欢显式调用 truncate() ,即使它是不必要的。
    • 如果你已经使用“r+”打开了文件,如果你已经解析了文件,那么使用 truncate(0),你可能已经解析了。将此添加到上面的答案中以使其完整!
    • 使用 f.seek(0) 将指针移动到文件的开头
    • 我正在阅读和写入文件。答案完美地截断了文件,但请注意,如果您想再次向其写入内容,请不要忘记在 f.truncate(0) 之后添加 f.seek(0),否则您将在文件开头附加奇怪的 \x00。
    【解决方案2】:

    以“写入”模式打开文件会清除它,您不必专门对其进行写入:

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

    (您应该关闭它,因为文件自动关闭的时间可能是特定于实现的)

    【讨论】:

      【解决方案3】:

      不是一个完整的答案,更像是对 ondra 答案的扩展

      使用truncate()(我的首选方法)时,请确保您的光标位于所需位置。 当打开一个新文件进行读取时 - open('FILE_NAME','r') 它的光标默认为 0。 但是,如果您在代码中解析了文件,请确保再次指向文件的开头,即truncate(0) 默认情况下,truncate() 从当前光标位置开始截断文件的内容。

      A simple example

      【讨论】:

      • 这对我了解 truncate() 在光标位置方面的工作有很大帮助。
      【解决方案4】:

      正如@jamylak 所建议的,包含benefits of context managers 的一个不错的选择是:

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

      【讨论】:

        【解决方案5】:

        使用with open("myfile.txt", "r+") as my_file: 时,myfile.txt 中出现奇怪的零,尤其是因为我首先读取文件。为了让它工作,我必须首先将my_file 的指针更改为my_file.seek(0) 的文件开头。然后我可以通过my_file.truncate() 清除文件。

        【讨论】:

        • 这应该不足为奇,3 年前在this answer 中提到过。
        【解决方案6】:

        写入和读取文件内容

        def writeTempFile(text = None):
            filePath = "/temp/file1.txt"
            if not text:                      # If not provided 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
        

        它对我有用

        【讨论】:

          【解决方案7】:

          您必须覆盖该文件。在 C++ 中:

          #include <fstream>
          
          std::ofstream("test.txt", std::ios::out).close();
          

          【讨论】:

          • 不需要close() 电话。析构函数将关闭文件。所以你只需要创建一个临时的:ofstream("test.txt");
          • 自此答案以来,此问题已更改。考虑到问题的新方向,也许删除问题?
          【解决方案8】:

          如果安全性对您很重要,那么打开文件进行写入并再次关闭它是不够的。至少部分信息仍会保存在存储设备上,并且可以通过例如使用磁盘恢复实用程序找到。

          例如,假设您要擦除的文件包含生产密码,需要在当前操作完成后立即删除。

          使用完文件后将其归零有助于确保敏感信息被销毁。

          在最近的一个项目中,我们使用了以下代码,它适用于小文本文件。它用零行覆盖现有内容。

          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 ShredderCCleaner 来清除驱动器上的“空白”空间。 p>

          【讨论】:

            【解决方案9】:

            你也可以使用这个(基于上面的几个答案):

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

            当然,这是清除文件的一种非常糟糕的方法,因为它需要这么多行代码,但我写这个只是为了向您展示它也可以用这种方法完成。

            编码愉快!

            【讨论】:

              【解决方案10】:

              除非您需要擦除结尾,否则您不能就地“擦除”文件。要么满足于覆盖“空”值,要么读取您关心的文件部分并将其写入另一个文件。

              【讨论】:

              • 确定如何在不提供垃圾值的情况下覆盖它?我的意思是假设字符串长度为 9 并且我用字符串长度 6 覆盖它。这意味着 3 个垃圾值 rt?
              • 正确。另外,您必须有某种方式向任何读者识别这三个字符是垃圾的事实。
              • 事实上我的代码跨越了 python 和 c++ 。因此,如果在 C++ 中完成文件读取并在 python 中完成文件写入 .. 文件都必须被擦除..
              【解决方案11】:

              在您的程序中将文件指针分配给 null 只会摆脱对该文件的引用。文件还在。我认为 c stdio.h 中的 remove() 函数是您要在那里寻找的。不确定 Python。

              【讨论】:

              • 顺便说一句,remove() 和 unlink() 都会减少常规文件的引用计数,而不是实际删除它。一旦引用计数降至零,该文件将被删除。例如,如果您的进程打开了文件,并且您对其调用 unlink() 或 remove(),则在文件 close()d 之前它不会被删除(即引用计数降至零 - 也假定没有其他进程打开文件)。此行为很有用,例如,确保在异常进程终止后不会留下临时文件(例如 open()、unlink()、执行文件 IO、CRASH、close() 未调用)。
              【解决方案12】:

              由于文本文件是连续的,您不能直接擦除其中的数据。您的选择是:

              • 最常用的方法是创建一个新文件。从原始文件中读取并将所有内容写入新文件,除了您要擦除的部分。写入所有文件后,删除旧文件并重命名新文件,使其具有原始名称。
              • 您还可以从要更改的位置开始截断和重写整个文件。寻找要更改的点,然后将文件的其余部分读入内存。回溯到同一点,截断文件,然后写回没有要擦除的部分的内容。
              • 另一个简单的选项是用另一个相同长度的数据覆盖数据。为此,请寻找确切位置并写入新数据。限制是它必须具有完全相同的长度。

              查看seek/truncate 函数/方法来实现上述任何想法。 Python 和 C 都有这些功能。

              【讨论】:

              • 我只想从头开始擦除整个文件
              • 然后删除文件。在 python 中使用os.removeos.unlink,或在C 中使用unlink。另一种选择是重新打开文件进行写入或使用truncate
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-03-07
              • 2014-03-14
              • 1970-01-01
              • 2018-03-01
              • 1970-01-01
              • 2013-06-12
              • 2021-05-05
              相关资源
              最近更新 更多