【问题标题】:deleting file if it exists; python如果文件存在则删除文件; Python
【发布时间】:2013-04-16 14:08:20
【问题描述】:

我想创建一个文件;如果它已经存在,我想删除它并重新创建它。我试过这样做,但它会引发 Win32 错误。我做错了什么?

try:
    with open(os.path.expanduser('~') + '\Desktop\input.txt'):
        os.remove(os.path.expanduser('~') + '\Desktop\input.txt')
        f1 = open(os.path.expanduser('~') + '\Desktop\input.txt', 'a')
except IOError:
    f1 = open(os.path.expanduser('~') + '\Desktop\input.txt', 'a')

【问题讨论】:

标签: python file-io try-catch


【解决方案1】:

您正在尝试删除一个打开的文件,以及os.remove() 状态的文档...

在 Windows 上,尝试删除正在使用的文件会引发异常

您可以将代码更改为...

filename = os.path.expanduser('~') + '\Desktop\input.txt'
try:
    os.remove(filename)
except OSError:
    pass
f1 = open(filename, 'a')

...或者您可以将所有内容替换为...

f1 = open(os.path.expanduser('~') + '\Desktop\input.txt', 'w')

...在打开之前将文件截断为零长度。

【讨论】:

  • 这是一个潜在的竞争条件,在删除它之前检查os.path.exists
  • 另一个程序可能正在对该文件进行操作,并在 os.path.exists 评估为 True 后将其删除。
  • 哦,是的,现在很好,我刚写完我就意识到你可以使用'w',但我之前有过
【解决方案2】:

您试图在文件打开时删除它,您甚至不需要那里的with 来删除它:

path = os.path.join(os.path.expanduser('~'), 'Desktop/input.txt')
with open(path, 'w'): as f:
    # do stuff

如果存在则删除

【讨论】:

    【解决方案3】:

    您可以将 open 与 mode 参数 = 'w' 一起使用。如果省略 mode,则默认为 'r'。

    with open(os.path.expanduser('~') + '\Desktop\input.txt', 'w')
    

    w 将文件截断为零长度或创建文本文件进行写入。 流位于文件的开头。

    【讨论】:

    • @Yui 我不明白你说如果它存在就删除它...请更新你的问题,不要附加任何条件
    • 是的,如果它在我启动脚本之前已经存在,我想删除它。重新创建后,我有多个字符串附加到新文件
    【解决方案4】:

    Windows 不允许您删除打开的文件(除非它是使用不寻常的共享选项打开的)。您需要在删除之前将其关闭:

    try:
        with open(os.path.expanduser('~') + '\Desktop\input.txt') as existing_file:
            existing_file.close()
            os.remove(os.path.expanduser('~') + '\Desktop\input.txt')
    

    【讨论】:

      【解决方案5】:

      试试这个:

       from os import path, 
          PATH = os.path.expanduser('~') + '\Desktop\input.txt'
          if path.isfile(PATH):
             try:
                os.remove(os.path.expanduser('~') + '\Desktop\input.txt')
             except OSError:
                pass
      

      编辑:

      from os import path, 
              PATH = os.path.expanduser('~') + '\Desktop\input.txt'
              try:
                  os.remove(os.path.expanduser('~') + '\Desktop\input.txt')
              except OSError:
                  pass
      

      【讨论】:

      • 这里还有潜在的竞争条件
      • 现在没有竞争条件,但path.isfile(PATH) 已变得有效冗余
      • 谢谢,我认为这会使解决方案更安全。在这种情况下,我认为我的解决方案将与 Aya 完全相同。
      • 它并不像 Aya 那样安全。您的解决方案只执行两项检查而不是一项,其中第一项根本无助于安全性,只有第二项可以
      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2015-07-12
      • 2015-10-31
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多