使用Python的os.rename时出现错误[183]

5
这是我第一次使用Python,但我一直遇到错误183。我创建的脚本在网络中搜索所有'.py'文件并将它们复制到我的备份驱动器。请不要嘲笑我的脚本,因为这是我第一次写。你有什么提示吗?
import os
import shutil
import datetime

today = datetime.date.today()
rundate = today.strftime("%Y%m%d")

for root,dirr,filename in os.walk("p:\\"):
    for files in filename:
        if files.endswith(".py"):
            sDir = os.path.join(root, files)
            dDir = "B:\\Scripts\\20120124"
            modname = rundate + '_' + files
            shutil.copy(sDir, dDir)
            os.rename(os.path.join(dDir, files), os.path.join(dDir, modname))
            print "Renamed %s to %s in %s" % (files, modname, dDir)

你能否编辑你的原始帖子并复制粘贴完整的堆栈跟踪信息?这不仅仅是一个“文件已存在”的错误吗? - Olivier H
哈哈脚本!:) 只是开玩笑! - Bali C
1
你至少应该检查目标位置是否存在该文件。然而,更好的选择是考虑使用rsync来大幅简化你的脚本(因为其他人已经为你完成了繁重的工作)。 - GoingTharn
3个回答

5
我猜您正在Windows上运行脚本。根据Windows错误代码列表,错误183是ERROR_ALREADY_EXISTS
所以我猜测脚本失败的原因是您试图重命名一个已经存在的文件。
也许您每天运行脚本超过一次?这将导致所有目标文件已经存在,因此当再次运行脚本时重命名将失败。
如果您特别想覆盖这些文件,那么您应该先使用os.unlink删除它们。

基本上,该脚本将每月运行一次,然后进行归档。脚本的设置方式是先复制文件,然后重命名,至少我认为是这样发生的,对吗? - Rob Black
这是正确的,但如果在重命名时出现183错误,则似乎你要重命名的文件名已经存在。或者错误发生在复制文件时,在这种情况下,你要复制到的文件已经存在。也许还有其他问题,但显而易见的答案是脚本已经运行了一天以上。 - obmarg

2
考虑到错误183是“[Error 183] Cannot create a file when that file already exists”,你很可能在os.walk()调用中找到了两个同名的文件,第一个文件重命名成功后,第二个文件将无法重命名为相同的名称,因此会出现文件已存在的错误。
我建议在os.rename()调用周围使用try/except来处理这种情况(在名称后面添加数字或其他内容)。
是的,我知道这个问题已经问了7年,但如果我从谷歌搜索中找到了这里,也许其他人也能找到它,这个答案可能有所帮助。

0

我刚遇到了同样的问题,当你试图将一个文件夹重命名为与同一目录中已存在的文件夹相同的名称时,Python会引发错误。

如果你在Windows资源管理器中尝试这样做,它会询问你是否要合并这两个文件夹。然而,Python没有这个功能。

以下是我的代码,可以实现重命名一个文件夹,同时已经存在一个同名文件夹,也就是合并文件夹。

import os, shutil

DEST = 'D:/dest/'
SRC = 'D:/src/'

for filename in os.listdir(SRC):  # move files from SRC to DEST folder.
    try:
        shutil.move(SRC + filename, DEST)
    # In case the file you're trying to move already has a copy in DEST folder.
    except shutil.Error:  # shutil.Error: Destination path 'D:/DEST/xxxx.xxx' already exists
        pass

# Now delete the SRC folder.
# To delete a folder, you have to empty its files first.
if os.path.exists(SRC):
    for i in os.listdir(SRC):
        os.remove(os.path.join(SRC, i))
    # delete the empty folder
    os.rmdir(SRC)

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