Python os.rename"无法创建文件,因为该文件已经存在。

3

我只是使用在这里找到的一个简单脚本:

import os
from os import rename, listdir

print os.listdir(".")
for filename in os.listdir("."):
    if filename.startswith("colon-"):
        print filename
        os.rename(filename, filename[7:])

我需要把所有像colon-21.mp3这样的文件转换成21.mp3。

但是我收到了错误信息“当该文件已经存在时无法创建文件。” 如何解决这个问题?我使用的是Windows 7。


1
确保文件不存在。 - Mike Pennington
但是我需要将已经存在的文件colon-21.mp3重命名为21.mp3...所以它在技术上并不存在。 - gran_profaci
@J.F.Sebastian 那个链接在这种情况下并没有什么帮助。他之所以出现这个错误,是因为他在尝试切片字符串时使用了错误的索引,正如我在答案中所解释的那样。 - Alex V
@Maxwell:这就是为什么我将其发布为评论而不是答案。该链接展示了如何避免异常。请考虑那些基于问题标题从谷歌跳转到此处的人们。 - jfs
1个回答

5
问题就在这里:
os.rename(filename, filename[7:])

Python 的索引从 0 开始,而字符串 "colon-" 只有 6 个字符,因此使用您的代码,colon-21.mp3 将变成 1.mp3。将该行更改为使用 filename[6:],您的问题应该就解决了。
话虽如此,像您现在所做的硬编码字符串长度并不是一个好主意。它很容易出错,正如我们在这里发现的那样(这种硬编码数字通常被称为“魔术数字”,因为很难确定它们为什么设置为特定的长度)。一个更好的替代方案是:
os.rename(filename, filename.split('-')[1])

1
或者我们也可以使用split()函数和-符号,即filename.split("-")[1] - Ashwini Chaudhary
1
@Ashwini 我并不是在赞同 gran_profaci 使用的方法,我只是想向他展示他的代码有问题。我同意使用硬编码数字通常是一个不好的主意。我已经更新了我的答案,向 gran_profaci 解释为什么硬编码字符串长度是不好的,并包括了你的例子作为推荐的替代方案。 - Alex V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接