Python不会删除每个文件/目录

时间:2019-08-22 15:55:55

标签: python python-3.x file directory shutil

我想将“ temp”文件夹的内容移动到主文件夹,其中包含2个文件夹和1个文件的示例:

1. Hello
2. World
3. python.exe

temp文件夹中,我有完全相同的内容。我想先删除main文件夹的内容,然后将内容从temp文件夹移到main文件夹,该文件夹应该为空,因为我删除了所有文件和文件夹,对?

问题是os.rmdiros.remove并没有删除所有文件...它可能会删除4个文件中的2个文件和2个文件夹中的1个。我没有获得任何权限错误我只得到shutil错误,说目标路径已经存在(请注意,os.rmdir()出于某种原因未将其删除)。

Traceback (most recent call last):
  File "C:/Users/Test/Desktop/test_folder/ftpdl.py", line 346, in run
    shutil.move(os.getcwd() + "\\temp\\" + f, os.getcwd())
  File "C:\Python\lib\shutil.py", line 564, in move
    raise Error("Destination path '%s' already exists" % real_dst)
shutil.Error: Destination path 'C:\Users\Test\Desktop\test_folder\Mono' already exists

我的代码如下:

dircontents = os.listdir(os.getcwd())
for file in dircontents:
    if file == os.path.isfile(os.getcwd() + "\\" + file):
        if file != 'testfile.py' and file != 'logo.ico' and file != 'settings.xml' and file != 'settings_backup.xml':
            os.remove(os.getcwd() + "\\" + file)
            break
    if file == os.path.isdir(os.getcwd() + "\\" + file):
        if file != 'temp':
            os.rmdir(os.getcwd() + "\\" + file)
            break

newfiles = os.listdir(os.getcwd() + "\\temp")
for f in newfiles:
    shutil.move(os.getcwd() + "\\temp\\" + f, os.getcwd())

预期结果是主文件夹中的所有旧内容都将被删除,而temp文件夹中的新内容将被移至主文件夹中,但这是行不通的。我会说它正在部分工作。

1 个答案:

答案 0 :(得分:1)

这是不正确的:

if file == os.path.isfile(os.getcwd() + "\\" + file):

isfile()返回TrueFalse,而不返回文件名。您应该只测试调用的结果,而不要将其与文件名进行比较。

也不需要在os.getcwd()前面加上-相对路径名始终相对于当前目录进行解释。同样,os.listdir()默认为当前目录。

应该是:

if os.path.isfile(file):

而且您不应该拥有break,这会使循环在删除第一件事后停止。

并使用elif进行第二次测试,因为这两种情况是互斥的。

dircontents = os.listdir()
for file in dircontents:
    if os.path.isfile(file) and file not in ['testfile.py', 'logo.ico', 'settings.xml', 'settings_backup.xml']:
        os.remove(file)
    elif os.path.isdir(file) and file != 'temp':
        os.rmdir(file)

newfiles = os.listdir("temp")
for f in newfiles:
    shutil.move("temp\\" + f, os.getcwd())